这(挥发性bool)总是线程安全吗?

Aid*_*api 22 c# volatile thread-safety

我想知道这是否完全是线程安全的,以及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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*kis 11

当然,SLaks所回答的是正确的,但要回答你的问题:两者都是:它是安全的,它应该被宣布为不稳定的.


SLa*_*aks 10

您应该用a替换整个构造ManualResetEvent,这既是线程安全的又是更快的.

private static readonly ManualResetEvent ev = new ManualResetEvent();

private static void Main()
{
    ev.WaitOne()
}

private static void SomeOtherThread()
{
    Thread.Sleep(1000);
    ev.Set();
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是*我想要的,我不希望主线程(在这种情况下)睡觉.我只是希望它继续迭代.否则我也会使用不同的构造.对不起,我不清楚这个,请看更新. (3认同)