保持两个线程之间的布尔值同步
在一个线程(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
应该可以解决您的问题。