这(挥发性布尔值)是否总是线程安全

本文关键字:线程 安全 是否 挥发性 布尔值 | 更新日期: 2023-09-27 18:19:41

我想知道这是否完全是线程安全的,以及 volatile 关键字是否应该到位。

using System.Threading;
class Program
{
    private static volatile bool _restart = true;
    private static void Main()
    {
        while (_restart)
        {
            // Do stuff here every time for as long as _restart is true
            Thread.Sleep(1);
        }
    }
    private static void SomeOtherThread()
    {
        Thread.Sleep(1000);
        _restart = false;
    }
}

我认为是的,但我想仔细检查,因为我不是 100% 确定我只是想确定。

我认为 volatile 关键字是必需的,因为这样就永远不可能将值缓存在寄存器或类似的优化中。

这(挥发性布尔值)是否总是线程安全

当然,SLaks 的回答是正确的,但要回答你的问题:在两个方面都是肯定的:它是安全的,应该声明它是易失性的。

你应该用一个 ManualResetEvent 替换整个结构,这既线程安全又更快。

private static readonly ManualResetEvent ev = new ManualResetEvent();
private static void Main()
{
    ev.WaitOne()
}
private static void SomeOtherThread()
{
    Thread.Sleep(1000);
    ev.Set();
}