这(挥发性布尔值)是否总是线程安全
本文关键字:线程 安全 是否 挥发性 布尔值 | 更新日期: 2023-09-27 18:19:41
我想知道这是否完全是线程安全的,以及 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();
}