آموزش 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