返回信息流在知乎上看到一个人回答说:“原子变量本身已经用volatile修饰过了,所以原子变量有volatle属性”,请问这句话对吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #95909同步于 2017/7/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于C++中atomic与volatile的疑问
MrLoser
2017/7/31镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
就是说比如memory_order_relaxed模型是不保证更新可见性的?
【 在 shan10211865 的大作中提到: 】
: 看看暖神的回答能不能解决楼主的疑惑https://bbs.byr.cn/#!article/CPP/93075?p=1
volatile 修饰符,会在读取变量的时候,去内存重新读取而不是从 register 或 cache 等处。
atomic 修饰符,主要作用于 inc/dec (自增或自减操作), 多线程对同一个变量 inc/dec 不会出现错误;在实现 reference counting 的时候,很方便高效。
您说的这些我了解,我的疑问是atomic类型的变量的更新是不是会像volatile一样及时对其它线程可见。思考了一下,relaxed模型应该具有volatile语义
【 在 epico 的大作中提到: 】
: volatile 修饰符,会在读取变量的时候,去内存重新读取而不是从 register 或 cache 等处。
: atomic 修饰符,主要作用于 inc/dec (自增或自减操作), 多线程对同一个变量 inc/dec 不会出现错误;在实现 reference counting 的时候,很方便高效。
思考了一下,感觉relaxed模型没有volatile语义
坐等@nuanyangyang 解惑
【 在 MrLoser 的大作中提到: 】
: 您说的这些我了解,我的疑问是atomic类型的变量的更新是不是会像volatile一样及时对其它线程可见。思考了一下,relaxed模型应该具有volatile语义
我的理解是,单线程下是安全的,多线程的情况下非x86还是可能会出现
https://www.zhihu.com/question/24301047
另外暖神说了volitale关键字语言层面的行为定义的比较模糊?
【 在 MrLoser 的大作中提到: 】
: 就是说比如memory_order_relaxed模型是不保证更新可见性的?
额,我少打了个字,应该是relaxed模型不具有volatile语义 sorry
【 在 xiaobing307 的大作中提到: 】
: 思考了一下,感觉relaxed模型没有volatile语义
: 坐等@nuanyangyang 解惑
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语义