عند استخدام Lock VS MemoryBarrier في .NET
-
18-09-2019 - |
سؤال
في. نين lock
الكلمة الأساسية هي السكر النحوي حولها Monitor.Enter
و Monitor.Exit
, ، لذلك يمكنك أن تقول أن هذا الرمز
lock(locker)
{
// Do something
}
بالضبط مثل
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
ومع ذلك فإن الإطار .NET يشمل أيضا MemoryBarrier
الطبقة التي تعمل بطريقة مماثلة
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
أنا مرتبك كما هو الحال عندما أريد استخدام Thread.MemoryBarrier
على مدار lock
/Monitor
الإصدار؟ أنا جعلت أكثر حيرة من قبل تعليمي الخيوط التي تنص على أنها تعمل نفس الشيء.
بقدر ما أستطيع أن أرى الاختلاف المرئي لا يحتاج إلى كائن قفل، وأعتقد أن استخدام Monitor
يمكنك أن تفعل شيئا عبر المواضيع التي MemoryBarrier
على موضوع واحد.
بلدي الأمعاء يخبرني أن هناك فرقا رئيسي آخر هو MemoryBarrier
هو للمتغيرات فقط وليس للأساليب.
أخيرا هذا لا يرتبط بالسؤال الحالي عند استخدام "متقلب" أو "Thread.MemoryBarrierier" () "في كود قفل الخلافات؟ (ج #), ، كما يركز على volatile
الكلمة الرئيسية التي أفهمها استخدامها.
المحلول
في رأيي يجب عليك تقريبا أبدا استعمال Thread.MemoryBarrier
. وبعد هذا يستخدم ل قفل الكود - التأكد من أن التغييرات التي تم إجراؤها على مؤشر ترابط واحد مرئي لآخر دون تكبد تكلفة القفل. نعم هو كذلك ليس التحكم في مزامنة الموضوع، على عكس lock
. وبعد أنا لا أرى أين في البرنامج التعليمي جو يقول ذلك MemoryBarrier
"وظائف نفس" كما lock
. وبعد هل يمكن أن تفسر أين أنت بالضبط تحصل على هذا الانطباع؟
في رأيي، من الصعب للغاية أن يكون الكود الخالي من المستوى المنخفض لأي شخص آخر غير المطورين الذين تعزز إجادتها الرئيسية. إذا كنت أرغب في كتابة بعض الكود الخالي من القفل، فسأي استخدام كتل بناء المستوى الأعلى مبني من قبل هؤلاء المطورين (مثل الملحقات الموازية في .NET 4.0) بدلا من محاولة لفة الخاصة بي.
مثلما مثال، لقد فتحت عيني مؤخرا المعنى الدقيق لل volatile
أي ليس كذلك "اقرأ دائما من الذاكرة الرئيسية، والكتابة دائما مباشرة إلى الذاكرة الرئيسية". (لا يزال البرنامج التعليمي الخاص بي الخيوط الخاص بي التفسير في الوقت الحالي - شيء أحتاج إلى إصلاحه في مرحلة ما.) إنه أكثر دقة بكثير من ذلك. وبعد هذا يعني ذاك بعض من استخداماتي السابقة volatile
قد يكون جيدا غير صحيح.