【问题标题】:Does Atomic variable flush cache only on cache line where it is at?原子变量是否仅在其所在的缓存行上刷新缓存?
【发布时间】:2021-06-30 18:51:44
【问题描述】:

我尝试尽可能使用原子变量而不是互斥锁。
因为原子变量工作在用户态,而互斥体工作在内核态,所以原子变量比互斥体快很多。

但我对原子变量有疑问。
原子变量是否获取,仅释放它所在的缓存行。
如果是对的,要释放所有缓存行,我应该使用互斥体吗???

【问题讨论】:

  • std::atomic 只使单个变量原子。如果您需要事务类型行为,其中必须更新多个变量并且所有更新在同一点(对其他线程)可见,那么您需要std::mutex
  • 如果需要内存屏障,请使用内存屏障。 atomic 与其他 atomic 的顺序相同,与缓存无关。顺便说一句,有很多缓存,因此您需要小心其中任何一个。
  • @OznOg 这不是真的。大多数最强的原子排序,如seq_cstacr_rel,也会影响非原子变量的内存排序。 releaseconsume 之间的区别在于不同线程上的非原子变量可见性。

标签: c++ multithreading c++11 atomic


【解决方案1】:

对原子对象本身的所有操作都是原子的:所有线程中的所有修改都有一个单一的顺序(对于那个特定的原子对象)。因此,获取/释放内容是关于修改 other 内存相对于原子变量的某些修改的可见性(尽管memory_order_relaxed 也会影响该原子对象上的操作与该原子对象上的其他操作的关系)。

例如,如果一个线程将一些数据设置为一个值,然后将一个原子变量设置为某个约定的值,如果另一个线程看到具有该值的原子变量,则正确使用获取/释放标志原子读/写允许其他线程安全地访问由设置原子变量的线程设置的其他数据。

因此,这些标志适用于进程中潜在的所有内存操作。

此外,您不应该从“释放缓存行”或其他方面考虑它。 C++ 内存模型应该根据自身来阅读:由于操作的顺序,哪些数据对哪些线程可见和可访问。让实现解决细节。

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多