首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"regular“变量来同步线程

使用"regular“变量来同步线程
EN

Stack Overflow用户
提问于 2013-04-10 05:08:34
回答 2查看 195关注 0票数 1

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

代码语言:javascript
复制
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的读或写是原子的,即使不是这样,我也看不出它在这里有什么不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-10 05:21:22

不,它不能工作。如果你使用std::atomic<bool>,它将会工作。

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2013-04-10 05:47:41

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15912568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档