0Pricing
Go Academy · درس

كاشف حالات التنافس والأنماط الآمنة

استخدام الخيار -race وتجنّب حالات تنافس البيانات

كاشف حالات التنافس والأنماط الآمنة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

ما المقصود بـ data race؟

تحدث data race عندما تصل goroutines إلى موقع الذاكرة نفسه بالتزامن، وتكون إحدى عمليتي الوصول على الأقل عملية كتابة، من دون مزامنة. وتتسبب data races في سلوك غير محدد.

تفعيل كاشف التنافس

شغّل البرنامج أو الاختبارات باستخدام -race لتفعيل كاشف التنافس المضمّن في Go:

go run -race main.go
go test -race ./...

مخرجات كاشف التنافس

عند اكتشاف حالة تنافس، يطبع الكاشف تتبعات مكدس goroutines التي توضح عمليات الوصول المتعارضة، ثم ينهي البرنامج. وتشير المخرجات إلى الأسطر المحددة المعنية.

تكلفة الأداء

يضيف كاشف التنافس حملًا زائدًا على الذاكرة بنحو 5 إلى 10 أضعاف، ويبطئ التنفيذ بنحو ضعفين إلى 20 ضعفًا. شغّله في CI وبيئات الاختبار، وليس في إصدارات الإنتاج.

الأنماط الآمنة الشائعة: العمليات الذرية

يوفر sync/atomic عمليات خالية من الأقفال لعدادات الأعداد الصحيحة والمؤشرات البسيطة، متجنبًا الحمل الزائد لـ Mutex كامل.

var counter int64
atomic.AddInt64(&counter, 1)
fmt.Println(atomic.LoadInt64(&counter))

الأنماط الآمنة الشائعة: ملكية القنوات

تمتلك goroutine واحدة قيمةً في كل مرة؛ وتنتقل الملكية عبر القنوات. وبغياب الذاكرة المشتركة، لا تحدث data races.

ch := make(chan []byte)
go func() { ch <- makeData() }()
data := <-ch // sole owner now

الأنماط الآمنة الشائعة: البيانات غير القابلة للتغيير

تكون البيانات للقراءة فقط والمشتركة بين goroutines آمنة. لا تكتب فيها إلا قبل بدء goroutines، أو قم بمزامنة عمليات الكتابة. ويمكن مشاركة قيم String و[N]T بأمان بعد إنشائها.

اكتشاف حالات التنافس في الاختبارات

يعمل كاشف التنافس مع go test -race. اكتب اختبارات تمارس المسارات المتزامنة — فالكاشف يلتقط حالات التنافس التي تفوت الاختبارات التسلسلية السليمة.

sync.atomic مقابل Mutex

استخدم العمليات الذرية لتحديث متغير واحد، مثل العدادات والأعلام. واستخدم Mutex لحماية الثوابت التي تمتد عبر عدة متغيرات. أما المزج بينهما من دون تحليل دقيق فهو عرضة للأخطاء.

علاقة happens-before

يضمن Go علاقات happens-before لعمليات القنوات وMutex Lock/Unlock وsync.Once.Do. وتُرتّب العمليات داخل goroutine نفسها ترتيبًا تسلسليًا.

المشاركة الزائفة

يمكن أن تتسبب goroutines التي تحدّث ذاكرة متجاورة (حقولًا مختلفة في سطر التخزين المؤقت نفسه) في اضطراب ذاكرة التخزين المؤقت. احشو البنى باستخدام [64]byte إذا أوضح تحليل الأداء وجود تنافس على بنية محددة.

اختبار سريع

ما العَلَم الذي يفعّل كاشف التنافس في Go؟

مراجعة: كاشف التنافس والأنماط الآمنة

النقاط الأساسية:

  • شغّل go test -race دائمًا في CI
  • الأنماط الآمنة: القنوات وMutex والعمليات الذرية والبيانات غير القابلة للتغيير
  • تُظهر مخرجات كاشف التنافس مكدسات goroutines المحددة
  • لا تستخدم -race في إصدارات الإنتاج

الأسئلة الشائعة

هل درس «كاشف حالات التنافس والأنماط الآمنة» مجاني؟

نعم — نص درس «كاشف حالات التنافس والأنماط الآمنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «كاشف حالات التنافس والأنماط الآمنة»؟

استخدام الخيار -race وتجنّب حالات تنافس البيانات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «كاشف حالات التنافس والأنماط الآمنة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏sync.Mutex وsync.RWMutex
  2. ‏sync.WaitGroup
  3. ‏sync.Once وsync.Map
  4. كاشف حالات التنافس والأنماط الآمنة
← العودة إلى Go Academy