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

时间:2012-01-08 17:00:20

标签: c# thread-safety volatile

我想知道这是否完全是线程安全的,以及是否应该使用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关键字是必需的,因为它永远不可能将值缓存在寄存器或类似的优化中。

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:10)

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

private static readonly ManualResetEvent ev = new ManualResetEvent();

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

private static void SomeOtherThread()
{
    Thread.Sleep(1000);
    ev.Set();
}