【发布时间】:2021-06-30 18:51:44
【问题描述】:
我尝试尽可能使用原子变量而不是互斥锁。
因为原子变量工作在用户态,而互斥体工作在内核态,所以原子变量比互斥体快很多。
但我对原子变量有疑问。
原子变量是否获取,仅释放它所在的缓存行。
如果是对的,要释放所有缓存行,我应该使用互斥体吗???
【问题讨论】:
-
std::atomic只使单个变量原子。如果您需要事务类型行为,其中必须更新多个变量并且所有更新在同一点(对其他线程)可见,那么您需要std::mutex。 -
如果需要内存屏障,请使用内存屏障。 atomic 与其他 atomic 的顺序相同,与缓存无关。顺便说一句,有很多缓存,因此您需要小心其中任何一个。
-
@OznOg 这不是真的。大多数最强的原子排序,如
seq_cst或acr_rel,也会影响非原子变量的内存排序。release和consume之间的区别在于不同线程上的非原子变量可见性。
标签: c++ multithreading c++11 atomic