保持两个线程之间的布尔值同步

时间:2011-12-17 13:22:22

标签: c# .net multithreading

在一个线程(thread2)中,我更改了一个值,例如

CheckSuccess = false;

现在主线程(thread1 - GUI / Form)没有获取更改,如何“传播”所有线程周围的更改?

我的印象是线程应该操纵数据,而不是在单独的实例上工作(除非被告知这样做)

3 个答案:

答案 0 :(得分:2)

好像是Race Condition。为避免这种情况,您应该同步对共享变量的访问。

  • 如果CheckSuccess是字段,请尝试按volatile关键字标记。
  • 如果CheckSuccess是属性(将转换为方法调用),则可以使用lock() statement

    private static readonly object stateLock = new object();
    lock (stateLock)
    {
        // access a shared variable here
        CheckSuccess  = false;
    }
    
  • 如果CheckSuccess是UI控件的属性,并且您希望从工作线程更改它 - 您应该使用特殊技术将更改从工作线程推送到UI线程,这取决于您使用哪个框架正在使用WPF的WinForms。

<强> PS: 此外,如果您有多个线程读取值并且几个线程写入(基本上读取比写入更频繁),您可能会发现有用的ReaderWriterLock

答案 1 :(得分:0)

我通常使用联锁方法,例如Exchange。这比使用锁定对象简单得多,并且保证是原子的。

答案 2 :(得分:0)

问题很可能是编译器优化导致在CPU寄存器中缓存布尔值。将其声明为volatile可以解决您的问题。