برنامه نویسی

آموزش Golang: استفاده از Mutex با goroutines

هنگام کار با goroutines ، اغلب باید داده ها را بین آنها به اشتراک بگذارید. با این حال ، دسترسی همزمان به متغیرهای مشترک می تواند منجر به شرایط مسابقه شود ، جایی که چندین گوروژین سعی می کنند همزمان با خواندن/نوشتن یکسان همزمان ، منجر به رفتار غیرقابل پیش بینی شوند.

برای حل این مسئله ، GO مکانیسم هماهنگ سازی به نام MUTEX را از بسته SYNC فراهم می کند.

mutex چیست؟
یک mutex (کوتاه برای محرومیت متقابل) فقط به یک گوروتین اجازه می دهد تا به یک بخش مهم از کد در یک زمان دسترسی پیدا کند.
در GO ، آن را توسط نوع sync.mutex نشان داده شده است.
شما قبل از دسترسی به منبع مشترک و باز کردن قفل () پس از اتمام کار ، با قفل () تماس می گیرید.

مثال با mutex

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    counter := 0
    var mu sync.Mutex{} // Create a mutex

    var wg sync.WaitGroup // To wait for all goroutines

    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            mu.Lock()   // Lock the mutex before accessing counter
            counter++   // Critical section
            mu.Unlock() // Unlock after done
        }()
    }

    wg.Wait() // Wait until all goroutines complete
    fmt.Println("Final counter:", counter)
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خروجی:

Final counter: 1000
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🚀 نکات
همیشه از defer mu.unlock () استفاده کنید تا از باز کردن قفل حتی اگر وحشت یا بازگشت زود هنگام وجود داشته باشد.
برای جلوگیری از مشکلات عملکرد ، خیلی طولانی از نگه داشتن قفل خودداری کنید.
هنگام اجرای برنامه خود از پرچم -race استفاده کنید تا شرایط مسابقه را تشخیص دهید:

go run -race main.go
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا