في 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# هناك ثلاث أدوات لـ