سؤال

في. نين 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 قد يكون جيدا غير صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top