【发布时间】:2019-12-19 16:39:26
【问题描述】:
使用 std::atomic 你可以做原子增量,比较交换等等。在成功和不成功的比较交换的情况下,您可以选择为内存排序提供一个值,或者您可以提供两个值,一个用于成功,一个用于不成功的比较和交换。有了这个,你可以 f.e.加快释放互斥体,在成功操作的情况下只需要释放行为。
但我想知道的是:哪种 CPU 架构通过其 ISA 支持这种区别?
【问题讨论】:
-
ARMv8 以及我认为可能所有使用 LL/sc 的架构。
-
释放互斥锁通常使用释放语义来实现。这实际上是发布语义得名的地方。
-
LL/SC 是否要求对成功和不成功的操作进行可能的区分?
-
您的问题是关于比较和交换的吗?您基本上是在问是否存在在两种内存顺序不同时生成的代码与使用两者中更强的一种内存顺序生成的代码不同的架构?
-
IIRC ll/sc 实际上并不执行任何排序本身 [至少在我熟悉的拱门上] - 它取决于包装器(在本例中为 std::atomic::try_xxx)在交换之前和之后添加它需要的任何栅栏 - 当然 那个 代码可以添加它喜欢的任何强度的任何栅栏,并且可以考虑交换是否失败。
标签: c++ multithreading std cpu-cache