C++的 std atomic 有捎带同步的效果吗?

2020-09-03 11:56:40 +08:00
 amiwrong123

https://www.cnblogs.com/zhao-zongsheng/p/9092520.html

atomic 可以保证对 atomic 变量的可见性。但想知道,一个线程先修改了 一个普通变量,再修改了 一个 atomic 变量,是否也可以保证 别的线程可见这个普通变量的修改?

2126 次点击
所在节点    C++
6 条回复
teawithlife
2020-09-03 13:41:39 +08:00
atomic 没有保证“可见性”这一说法,保证的是操作的原子性
另外文章中已经多次提到,在保证输入输出一致的情况下,C++编译器可以自行优化语句的执行顺序,因此你说的 atomic 变量和普通变量,哪个先改变是无法保证的,所以无法实现你说的“同步”效果
sryanyuan
2020-09-03 13:54:44 +08:00
需要依赖对应原子变量。

需要在线程 1 中使用 memory_order_release 来写原子变量,线程 2 中对于对应的原子变量使用 acquire,假设发现变更了,则即可对线程 1 中修改的普通变量可见
Akiyu
2020-09-03 13:58:23 +08:00
看起来你说的是 memory order.
https://en.cppreference.com/w/cpp/atomic/memory_order
https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync

你不指定任何参数, 默认类型为 Sequentially Consistent . 无论是普通变量, 还是 atomic 类型都是同步的. 这无需担心.
fakeshadow
2020-09-03 14:10:35 +08:00
原子操作的顺序可以控制内存顺序 /屏障。如果一致性要求高并且不熟悉原子操作请尽量使用 seqcst 。
Akiyu
2020-09-03 14:31:33 +08:00
dangyuluo
2020-09-03 15:24:02 +08:00
这不就是我前段时间纠结过的 Memory order 么😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703820

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX