在线程之间共享bool,对天真的方法有任何陷阱吗?

时间:2014-04-20 02:44:44

标签: c# multithreading

我需要一个简单的bool来将一个长时间运行的进程通知abord作为循环的一部分,如下所示:

bool Abort = false;
void MyLongRunningMethod()
{
while(true)
{
    // loop code goes here, takes 2 hours ish to run
    if(Abort)
       break;
}
}

我知道如何正确地写这个,但是我想知道,如果我把它保留下来有任何风险吗?或者是唯一的风险(在我的情况下这是一个非问题)循环可以运行一个额外的时间(在写入的同时读取bool)。

我错过了任何奇怪的边缘情况,或者这实际上完全没问题,如果我对下面的陈述没问题:“当abort为真时该方法应该会中断,但是在没有副作用的情况下可能会再运行一次”?或者我错过了一些可以彻底打破世界的东西?

1 个答案:

答案 0 :(得分:5)

首先,此处的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)