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

关于C++中atomic与volatile的疑问

MrLoser
2017/7/31镜像同步8 回复
在知乎上看到一个人回答说:“原子变量本身已经用volatile修饰过了,所以原子变量有volatle属性”,请问这句话对吗?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
shan10211865机器人#1 · 2017/7/31
看看暖神的回答能不能解决楼主的疑惑https://bbs.byr.cn/#!article/CPP/93075?p=1
MrLoser机器人#2 · 2017/7/31
就是说比如memory_order_relaxed模型是不保证更新可见性的? 【 在 shan10211865 的大作中提到: 】 : 看看暖神的回答能不能解决楼主的疑惑https://bbs.byr.cn/#!article/CPP/93075?p=1
epico机器人#3 · 2017/7/31
volatile 修饰符,会在读取变量的时候,去内存重新读取而不是从 register 或 cache 等处。 atomic 修饰符,主要作用于 inc/dec (自增或自减操作), 多线程对同一个变量 inc/dec 不会出现错误;在实现 reference counting 的时候,很方便高效。
MrLoser机器人#4 · 2017/7/31
您说的这些我了解,我的疑问是atomic类型的变量的更新是不是会像volatile一样及时对其它线程可见。思考了一下,relaxed模型应该具有volatile语义 【 在 epico 的大作中提到: 】 : volatile 修饰符,会在读取变量的时候,去内存重新读取而不是从 register 或 cache 等处。 : atomic 修饰符,主要作用于 inc/dec (自增或自减操作), 多线程对同一个变量 inc/dec 不会出现错误;在实现 reference counting 的时候,很方便高效。
xiaobing307机器人#5 · 2017/7/31
思考了一下,感觉relaxed模型没有volatile语义 坐等@nuanyangyang 解惑 【 在 MrLoser 的大作中提到: 】 : 您说的这些我了解,我的疑问是atomic类型的变量的更新是不是会像volatile一样及时对其它线程可见。思考了一下,relaxed模型应该具有volatile语义
shan10211865机器人#6 · 2017/7/31
我的理解是,单线程下是安全的,多线程的情况下非x86还是可能会出现 https://www.zhihu.com/question/24301047 另外暖神说了volitale关键字语言层面的行为定义的比较模糊? 【 在 MrLoser 的大作中提到: 】 : 就是说比如memory_order_relaxed模型是不保证更新可见性的?
MrLoser机器人#7 · 2017/7/31
额,我少打了个字,应该是relaxed模型不具有volatile语义 sorry 【 在 xiaobing307 的大作中提到: 】 : 思考了一下,感觉relaxed模型没有volatile语义 : 坐等@nuanyangyang 解惑
nuanyangyang机器人#8 · 2017/7/31
C++11里,atomic和volatile是正交的。 就像下面这个程序: atomic<int> progress; void worker() { for(int i = 0; i < 100; i++) { progress = i; // 等价于progress.store(i, memory_order_seq_cst) doSomething(i); } progress = 100; } void observer() { while(true) [ int prog = progress; //等价于progress.load(memory_order_seq_cst) printf("Progress: %d%%\n", prog); if (prog == 100) break; sleep(1); } printf("Finished!\n"); } 即使是seq_cst,编译器也可以把worker里的progress = i这一个语句省略掉,使得observer永远看到progress由0一下子跳到100。这是合法的,因为这样变换,结果相当于worker工作得太快了,快到让外界根本来不及观察到中间写入的值。 加了volatile这个没有确切意义的关键字以后,会建议编译器“老老实实来翻译”。至于具体怎么翻译,就要看GCC的manual了。那里有对GCC上volatile行为的具体描述 【 在 MrLoser 的大作中提到: 】 : 您说的这些我了解,我的疑问是atomic类型的变量的更新是不是会像volatile一样及时对其它线程可见。思考了一下,relaxed模型应该具有volatile语义