在线程之间共享一个bool,这是天真方法的一个小错误
本文关键字:一个 方法 天真 错误 线程 之间 bool 共享 | 更新日期: 2023-09-27 17:59:07
我需要一个简单的bool来通知一个长时间运行的进程作为循环的一部分中止,循环如下:
bool Abort = false;
void MyLongRunningMethod()
{
while(true)
{
// loop code goes here, takes 2 hours ish to run
if(Abort)
break;
}
}
我知道如何正确地写这篇文章,但我想知道,如果我照原样写,会有风险吗?或者,唯一的风险(在我的情况下这不是问题)是循环可能会运行额外的时间(在编写bool的同时读取它)。
我是否遗漏了任何奇怪的边缘情况,或者如果我对以下语句很满意:"当中止为真时,该方法应该中断,但可能会在没有副作用的情况下运行一段额外的时间",这真的完全可以吗?还是我错过了一些可以彻底打破那里世界的东西?
首先,这里的bool
应该标记为volatile
,以创建内存屏障/防止某些缓存给您带来假阴性。其次,CancellationTokenSource
是一个很好的替代方案:
private readonly CancellationTokenSource _cancel = new CancellationTokenSource();
void MyLongRunningMethod()
{
while (!_cancel.IsCancellationRequested)
{
// loop code goes here, takes 2 hours ish to run
}
}
然后停止循环:
_cancel.Cancel();
如果您希望保持原来的编写方式,请执行while (!Abort)
而不是while (true)