"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا قيمة Goroutine الخاصة بي غير مرئية للآخرين؟

لماذا قيمة Goroutine الخاصة بي غير مرئية للآخرين؟

تم النشر بتاريخ 2024-12-21
تصفح:581

Why Is My Goroutine\'s Value Not Visible to Others?

هل هذا لأن مترجم Go قام بتحسين الكود؟

المشكلة ليست تحسينًا بواسطة مترجم Go، بل نقص المزامنة. لا يتبع التعيين إلى i أي حدث مزامنة، لذلك لا يمكن ضمان مراعاته بواسطة أي goroutine آخر. في الواقع، قد يقوم المترجم العدواني بحذف عبارة i بأكملها.

نموذج ذاكرة Go

يحدد نموذج ذاكرة Go الشروط التي يتم بموجبها قراءة متغير في واحد. يمكن ضمان goroutine لمراقبة القيم الناتجة عن الكتابة إلى نفس المتغير في goroutine مختلف.

لإجراء تسلسل الوصول، قم بحماية البيانات من خلال عمليات القناة أو غيرها من أساسيات المزامنة مثل تلك في حزم المزامنة والمزامنة/الذرية.

إذا كان يجب عليك قراءة بقية هذا المستند لفهم سلوك برنامجك، فأنت ذكي للغاية. لا تكن ذكيًا.

التزامن

في المثال التالي، لا يتبع التعيين إلى أي حدث مزامنة، لذلك ليس من المضمون مراقبته بواسطة أي goroutine أخرى. في الواقع، قد يقوم المترجم العدواني بحذف عبارة go بأكملها.

var a string

func hello() {
  go func() { a = "hello" }()
  print(a)
}
يوضح المثال التالي كيفية إجراء تسلسل الوصول إلى i باستخدام sync.Mutex.

package main

يستورد (
    "مزامنة"
    "وقت"
)

الوظيفة الرئيسية () {
    مكس := جديد(sync.Mutex)
    أنا := 1
    اذهب للوظيفة () {
        ل {
            مكس.لوك()
            أنا  
            مكس.فتح()
        }
    }()
    
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3