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

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

CheckSuccess = false; 

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

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

这似乎是种族条件 。 为避免这种情况,您应该同步对共享变量的访问。

  • 如果CheckSuccess是一个字段 – 尝试用volatile关键字标记它。
  • 如果CheckSuccess是一个属性(将被转换为方法调用),则可以使用lock()语句 :

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

    • WinForms – 如何从C#中的另一个线程更新GUI?
    • WPF – 在运行时更新WPF控件

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

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

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