在C#中:Volatile、Interlocked或lock——为简单标志的线程安全该选哪个?
大家好!我是一名初学C#的开发者,正在尝试理解多线程。我有一个简单的类,用于启动后台线程。该线程应在`_isRunning`标志为true时持续运行。另一个线程(例如UI线程)可以将此标志设为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读写并非CPU级别的原子操作,并且编译器可能会优化循环,将`_isRunning`的值缓存到寄存器中。这样一来,线程将永远无法看到值的更改。
在C#中有三种工具可以用于解