sync.Mutex وsync.RWMutex
أنماط القفل وقفل القراءة والكتابة
sync.Mutex وsync.RWMutex درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
لماذا نستخدم Mutex؟
عندما تشترك عدة goroutine في حالة قابلة للتغيير، تؤدي عمليات القراءة والكتابة المتزامنة إلى حدوث حالات تسابق على البيانات. ويُسلسل Mutex الوصول بحيث لا يدخل القسم الحرج إلا goroutine واحدة في كل مرة.
أساسيات sync.Mutex
اقفل قبل قراءة الحالة المشتركة أو الكتابة إليها؛ وألغِ القفل بعد ذلك. استخدم defer لضمان إلغاء القفل حتى إذا تسببت الدالة في panic.
var mu sync.Mutex
var counter int
func inc() {
mu.Lock()
defer mu.Unlock()
counter++
}تضمين Mutex في بنية
ضمّن Mutex في البنية التي يحميها. ومن المتعارف عليه إعلان Mutex مباشرة فوق الحقول التي يحميها.
type SafeCounter struct {
mu sync.Mutex
v map[string]int
}
func (c *SafeCounter) Inc(key string) {
c.mu.Lock()
defer c.mu.Unlock()
c.v[key]++
}لا تنسخ Mutex
يجب عدم نسخ Mutex بعد أول استخدام له. مرّره بواسطة مؤشر أو ضمّنه في بنية تُمرَّر بواسطة مؤشر. وتكتشف أداة go vet عمليات النسخ.
sync.RWMutex
يتيح sync.RWMutex لعدة قرّاء العمل بالتزامن، لكنه يسمح بكاتب واحد فقط. استخدمه عندما تكون عمليات القراءة هي الغالبة والكتابة نادرة لزيادة معدل النقل.
var rw sync.RWMutex
var data map[string]int
func read(k string) int {
rw.RLock()
defer rw.RUnlock()
return data[k]
}
func write(k string, v int) {
rw.Lock()
defer rw.Unlock()
data[k] = v
}RLock مقابل Lock
يحصل RLock على قفل قراءة (مشترك)؛ ويحصل Lock على قفل كتابة (حصري). ويمنع قفل الكتابة المعلّق أقفال القراءة الجديدة، ما يمنع تجويع الكتّاب.
TryLock (Go 1.18+)
يحصل mu.TryLock() على القفل فقط إذا كان غير مقفول حاليًا، ويعيد قيمة منطقية. ويُعد مفيدًا عندما يكون الحجب غير مقبول.
if mu.TryLock() {
defer mu.Unlock()
// critical section
}حالات التعارض الميت
يحدث التعارض الميت عندما تحتفظ goroutine A بالقفل 1 أثناء انتظارها للقفل 2، وتحتفظ goroutine B بالقفل 2 أثناء انتظارها للقفل 1. احصل دائمًا على الأقفال بالترتيب نفسه، واجعل الأقسام الحرجة قصيرة.
دقة الأقفال
يسهل فهم القفل واسع النطاق، لكنه يقلل التزامن. ويحسن القفل دقيق النطاق معدل النقل، لكنه يزيد التعقيد وخطر التعارض الميت. ابدأ بقفل واسع النطاق، ثم حسّنه إذا أظهر تحليل الأداء وجود تنازع.
Mutex مقابل channel
استخدم Mutex عند حماية حالة مشتركة تضم عددًا كبيرًا من القرّاء والكتّاب. واستخدم channel عند نقل ملكية البيانات بين goroutine. القنوات للتواصل، وMutex للمزامنة.
واجهة sync.Locker
sync.Locker واجهة تحتوي على Lock وUnlock. ويطبّق كل من Mutex وRWMutex هذه الواجهة، ما يتيح للدوال المساعدة قبول أي من النوعين.
اختبار سريع
متى ينبغي استخدام sync.RWMutex بدلًا من sync.Mutex؟
مراجعة: Mutex وRWMutex
النقاط الأساسية:
- يُسلسل Mutex الوصول؛ استخدم defer Unlock دائمًا
- لا تنسخ Mutex بعد أول استخدام
- RWMutex: عدة قرّاء أو كاتب واحد
- احصل على الأقفال بترتيب ثابت لتجنب حالات الجمود
الأسئلة الشائعة
هل درس «sync.Mutex وsync.RWMutex» مجاني؟
نعم — نص درس «sync.Mutex وsync.RWMutex» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «sync.Mutex وsync.RWMutex»؟
أنماط القفل وقفل القراءة والكتابة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «sync.Mutex وsync.RWMutex»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- sync.Mutex وsync.RWMutex
- sync.WaitGroup
- sync.Once وsync.Map
- كاشف حالات التنافس والأنماط الآمنة