これが完全にスレッドセーフであるかどうか、および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();
}