在线程之间共享一个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,这是天真方法的一个小错误

首先,这里的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)