4

我可以在两个线程之间安全地共享这个“状态”对象吗?

    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;            
        }
    }
4

2 回答 2

4

编译器或 CPU 进行的缓存或重新排序等优化可能会破坏您的代码。您应该声明该字段volatile以防止这种情况:

private volatile bool status = false;

可能出错的一个例子是,如果两个线程在不同的内核上运行,则 的值status可能会被运行轮询线程的内核缓存在 CPU 寄存器中,因此永远不会看到另一个线程更新的值。

尝试在发布模式下构建您的应用程序,您应该会看到这种效果。

于 2012-07-17T09:51:00.730 回答
0

你最好简单地锁定变量,例如

private static readonly object _lock = new Object();

....

lock(_lock){
//access to boolean variable etc.
}

另一种可能性是将 bool 包装在 Lazy 中,并且对内部值的访问是线程安全的。

如果您想使用无锁机制来读取和更新值,您可以考虑使用 Interlocked 类中的方法。

这里的信息:

System.Threading.Interlocked

于 2012-07-17T09:54:48.737 回答