如果我只有两个线程,并且我希望其中一个线程等待另一个线程到达某个点,那么执行以下操作是否安全:
bool wait = true;
//Thread 1:
while(wait) ;
wait = true; //re-arm the signal
//Thread 2:
/* Preform here the code that needs to complete before Thread 1 continues */
wait = false;基本上,如果一个线程只对它进行写操作,而另一个线程只对其进行读操作,那么会出现问题吗?我假设单个bool的读或写是原子的,即使不是这样,我也看不出它在这里有什么不同。
发布于 2013-04-10 05:21:22
不,它不能工作。如果你使用std::atomic<bool>,它将会工作。
C++中的原子解决了三个问题。首先,在存储或读取需要多个总线周期的值的过程中,可能会发生线程切换;这称为“撕裂”。其次,两个线程可能运行在两个独立的处理器上,并且有两个独立的缓存,其中一个线程看不到另一个线程所做的更改。这就是所谓的“缓存一致性”。第三,编译器可能会移动代码,因为顺序似乎并不重要。
即使bool值可能只需要一个总线周期来读取或写入,它也不能解决其他两个问题。
没有可靠的捷径。使用适当的同步。
发布于 2013-04-10 05:47:41
虽然您可以使用std::atomic<bool>获得保证,但我认为您也许可以使用简单的volatile来使其工作,因为:
volatile值上的指令进行重新排序,因为其中一个线程总是写入变量,所以指令实际上是原子的所以不会有任何形式的撕裂。然而,缓存一致性的问题仍然存在,这取决于硬件或操作系统。
https://stackoverflow.com/questions/15912568
复制相似问题