1

如果我只有两个线程,并且我希望其中一个等待另一个达到某个点,那么执行以下操作是否安全:

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是原子的,即使不是,我也看不出它在这里有何不同。

4

2 回答 2

5

不,它不能工作。如果您std::atomic<bool>改用它,它将起作用。

C++ 中的原子解决了三个问题。第一,在存储或读取需要多个总线周期的值的过程中发生线程切换的可能性;这被称为“撕裂”。其次,两个线程可能会在两个具有两个独立缓存的独立处理器上运行,并且一个线程不会看到另一个线程所做的更改。这称为“缓存一致性”。第三,编译器可能会移动代码,因为顺序似乎无关紧要。

即使一个bool值可能只需要一个总线周期来读取或写入,它也不能解决其他两个问题。

没有可靠的捷径。使用适当的同步。

于 2013-04-09T21:21:22.150 回答
0

虽然您可以使用 a 获得保证std::atomic<bool>,但我认为您可以使用简单的 使其工作volatile,因为:

  • 编译器无法对volatile值的指令重新排序
  • 其中一个线程总是写入变量,因此指令实际上是原子的
  • 另一个线程不需要原子地进行读写

所以不会有任何形式的撕裂。但是,缓存一致性问题仍然存在,这取决于硬件或操作系统。

于 2013-04-09T21:47:41.063 回答