Avatar ·

في C#: Volatile أم Interlocked أم lock — ماذا تختار لسلامة الخيوط لعلم بسيط؟

مرحبًا أيها الزملاء! أنا مطور C# مبتدئ وأحاول فهم تعدد الخيوط. لدي كلاس بسيط يقوم بتشغيل خيط خلفي. يجب أن يعمل الخيط طالما أن العلم `_isRunning` يساوي true. يمكن لخيط آخر (مثل واجهة المستخدم) تعيين هذا العلم إلى false لإيقاف العمل الخلفي. إليك الكود المبسط: ```csharp public class Worker { private bool _isRunning = true; public void Start() { Task.Run(() => { while (_isRunning) { // بعض العمل Console.WriteLine("Working..."); Thread.Sleep(100); } }); } public void Stop() { _isRunning = false; } } ``` لقد قرأت أن القراءة/الكتابة البسيطة لـ bool ليست ذرية على مستوى المعالج، وقد يقوم المترجم بتحسين الحلقة عن طريق تخزين قيمة `_isRunning` مؤقتًا في سجل. عندها لن يرى الخيط التغيير أبدًا. في C# هناك ثلاث أدوات لـ