Bar*_*uch 1 c++ multithreading synchronization
如果我只有两个线程,并且我希望其中一个线程等待另一个线程达到某个点,那么执行以下操作是否安全:
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;
Run Code Online (Sandbox Code Playgroud)
基本上,如果一个线程只写入它而另一个只读取,那么会出现问题吗?我假设读取或写入单个bool是原子的,即使不是,我也看不出它如何在这里有所作为.
不,它不能工作.如果你使用std::atomic<bool>它,它将工作.
C++中的Atomics解决了三个问题.首先,在存储或读取需要多个总线周期的值的过程中发生线程切换的可能性; 这被称为"撕裂".第二,两个线程将在具有两个独立缓存的两个独立处理器上运行的可能性,并且一个线程将看不到另一个线程所做的更改.这称为"缓存一致性".第三,编译器可能会移动代码,因为顺序看起来并不重要.
尽管一个bool值可能只需要一个总线周期来读取或写入,但它并没有解决其他两个问题.
没有可靠的捷径.使用适当的同步.