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