我可以安全地在两个线程之间共享这个“状态”对象吗?
private bool status = false;
private void uiNewThread_bootloaderStartIdSetupAuto()
{
while (status)
;
}
以上是将从以下UI启动的新主题:
private void uiBtnBootloaderStartIdSetupAuto_Click(object sender, EventArgs e)
{
if (MessageBox.Show("ID will be setup starting from 1 to 16. \n\nAfter pressing 'YES', press the orange button one-by-one on the nodes.\nThe first pressed node will have number 1, the next number 2, and so on... \n\nWhen done, hit DONE button.", "ID setup", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
status = true;
Thread transmitConfig = new Thread(new ThreadStart(uiNewThread_bootloaderStartIdSetupAuto)); //close port in new thread to avoid
transmitConfig.Start();
}
else
{
Log(LogMsgType.Normal, "User cancelled");
status = false;
}
}
答案 0 :(得分:4)
编译器或CPU完成的高速缓存或重新排序等优化可能会破坏您的代码。您应该声明字段volatile
以防止这种情况:
private volatile bool status = false;
可能出错的一个例子是,如果两个线程在不同的内核上运行,status
的值可以由轮询线程运行的核心缓存在CPU寄存器中,从而永远不会看到由另一个线程更新的值。
尝试在发布模式下构建您的应用,您应该会看到此效果。
答案 1 :(得分:0)
最好只是锁定变量,例如
private static readonly object _lock = new Object();
....
lock(_lock){
//access to boolean variable etc.
}
另一种可能性是将bool包装在Lazy中,并且对内部值的访问是线程安全的。
如果要使用无锁机制来读取和更新值,可以考虑使用Interlocked类中的方法。
信息在这里: