c++ - 某些 CPU 上 std::atomic<T> 的内存排序

标签 c++ multithreading std cpu-cache

使用 std::atomic 你可以进行原子增量、比较交换等等。您可以选择在比较交换成功和不成功的情况下为内存排序提供一个值,或者您可以提供两个值,一个用于成功,一个用于不成功的比较和交换。有了这个,你可以。加快释放互斥锁,在成功操作的情况下只需要释放行为。

但我想知道的是:哪种 CPU 架构通过其 ISA 支持这种区分?

最佳答案

With this you can f.e. speed up releasing a mutex which only needs release-behaviour in case of a successful operation.

互斥量释放会如何失败?

释放未锁定的互斥量是一个编程错误。

纯释放操作几乎从不在有条件的情况下完成,获取操作是。引用计数是一个可能的异常(exception)。

But the thing I wonder about is: which CPU-architecture supports such a distinction through its ISA?

所有那些你会在比较和设置之后无条件插入围栏指令的地方。

再次引用计数的情况(这可能是 RMW 操作在互斥锁实现之外最常见的用法):

  • 只有计数达到 0 的情况才是值得注意的
  • count 只需要在有所有者时保持非 null 方面是“可靠的”
  • RC 实现合法引用和计数为 0 的互斥

本质上 RC 就像一个 RW 锁:

  • 根据定义,W 锁定与所有 R 解锁同步
  • 优先使用W锁
  • 当有线程等待W锁时,使得每一个R -unlock 尝试 W 锁定。

在这种情况下,您将 R-unlock(因此释放)并且如果 W-lock 处于挂起状态,并且没有其他 R-locks 处于事件状态,则 W-(re)lock。 (是的,我知道这个类比没有意义,因为您不会在执行 R 解锁的同一线程中进行 W 重新锁定,但无论如何。)

在那种情况下,您需要为 W 锁安装围栏。

因此,通常任何弱序 CPU 的获取都不是隐式加载的。

这对于 RC 和 RW 锁等原语很重要,您可以尝试将最后一个 R 锁转换为 W 锁(尝试锁升级)。

关于c++ - 某些 CPU 上 std::atomic<T> 的内存排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413759/

相关文章:

c++ - 为什么 volatile 在多线程 C 或 C++ 编程中没有用处?

c++ - (QNativeSocketEngine) QObject : Cannot create children for a parent that is in a different thread

c++ - 比较两个std::chrono::time_point实例时出错

c++ - vector 的 vector 到一维数组

c# - C++ 和 C# 之间的 token 登录?

C++ Cassandra 构建错误

c++ - 编译 openGL 后黑屏

c++ - 错误MSB4044:没有为 “CheckRuntimeLibrary”任务提供必需参数 “RuntimeLibrary”的值

Python 线程覆盖 init

c++ - Std 迭代器赋值错误