web-dev-qa-db-ja.com

これ(揮発性ブール)は常にスレッドセーフですか?

これが完全にスレッドセーフであるかどうか、および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キーワードが必要だと思います。そうすると、値をレジスターなどの最適化にキャッシュすることができなくなるからです。

22
Aidiakapi

もちろん、SLaksが答えたのは正しいですが、あなたの質問に答えるには、両方の点でそうです。安全であり、揮発性であると宣言する必要があります。

11
Mike Nakis

その構成全体をManualResetEventに置き換える必要があります。これは、スレッドセーフで高速です。

private static readonly ManualResetEvent ev = new ManualResetEvent();

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

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