gpt4 book ai didi

c# - 跨线程共享一个 bool 值,天真的方法有什么陷阱吗?

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:26 26 4
gpt4 key购买 nike

我需要一个简单的 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)

关于c# - 跨线程共享一个 bool 值,天真的方法有什么陷阱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com