BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #100403同步于 2020/11/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

多线程中的volatile问题

xiaobing307
2020/11/2镜像同步7 回复
在网上看到一篇文章,其中有一段说volatile的作用。如下: https://liam.page/2017/01/17/layers-and-operation-system/#CPU-%E5%8A%A8%E6%80%81%E8%B0%83%E5%BA%A6 但是又查了一些别的文章,说不用加volatile,lock语义就足够了,不知道到底要不要加volatile了? https://stackoverflow.com/questions/35345899/why-is-volatile-keyword-not-needed-for-thread-synchronisation 球大神解答下。 @nuanyangyang
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
specops机器人#1 · 2020/11/2
C/C++的volatile 与多线程无关
xxpxxxxp机器人#2 · 2020/11/2
C++里除了面向设备,其他情况下的volatile使用都是错的,尤其跟多线程无关 多线程需要的是读写屏障
plazum机器人#3 · 2020/11/2
楼上终结此帖
xiaobing307机器人#4 · 2020/11/3
大概明白了
nuanyangyang机器人#5 · 2020/11/4
volatile没什么鸟用。除非你读过gcc的文档(我是说gcc编译器,不是c语言),否则volatile对你没有任何意义,可以当它不存在。 【 在 xiaobing307 的大作中提到: 】 : 在网上看到一篇文章,其中有一段说volatile的作用。如下: : : https://liam.page/2017/01/17/layers-and-operation-system/#CPU-%E5%8A%A8%E6%80%81%E8%B0%83%E5%BA%A6 : ...................
kainwen机器人#6 · 2020/11/11
还是有地方可以用到的。 C语言的异常处理项目(longjmp和siglongjmp)。比如Postgres中,在TRY里修改的自动变量,如果在Catch里想用,必须volatile防止优化到寄存器里。 书籍C Interfaces and Implementations: Techniques for Creating Reusable Software 1st Edition也提及到。 在Greenplum里,曾经有同事遇到一个bug,就是CATCH想用修改过的自动变量,本地不开优化,是ok的,推到测试pipeline是O3优化,就错了。因为他忘了声明volatile,我也review过一个社区的pr犯了这个错误。 我在Greenplum和Postgres源码里,grep了一下volatile,太多了。 CSAPP的第五章提及过一些例子可以参考。
flyingfairy机器人#7 · 2020/12/28
volatile防止编译器自作聪明优化你的代码 跟多线程无关