gpt4 book ai didi

c++ - 为什么 memory_order 作为 std::atomic 函数的运行时参数给出

转载 作者:IT老高 更新时间:2023-10-28 22:21:46 24 4
gpt4 key购买 nike

std::atomic 函数,例如 storeload 采用 std::memory_order 参数。参数可以在运行时确定,就像任何其他函数参数一样。但是,实际值可能会影响编译期间代码的优化。考虑以下几点:

std::atomic<int> ai1, ai2;
int value = whatever;

void foo() {
std::memory_order memOrd = getMemoryOrder();
register int v = value; // load value from memory
ai1.store(v, memOrd); // dependency on v's value
ai2.store(1, memOrd); // no dependency. could this be move up?
}

如果 memOrd 恰好是 memory_order_relaxed,则第二个存储可以安全地移到第一个之前。这将在加载 value 和使用它之间增加一些额外的工作,这可能会防止其他需要的停顿。但是,如果 memOrdmemory_order_seq_cst,则不应允许切换存储,因为某些其他线程可能会依赖 ai1 已经设置为 value 如果 ai2 设置为 1。

我想知道为什么将内存顺序定义为运行时参数而不是编译时间。在决定最佳内存操作语义之前,是否有任何理由让某人在运行时检查环境?

最佳答案

原因这是作为运行时参数而不是编译时参数实现的,是为了启用组合。

假设您正在编写一个函数,该函数使用提供的原子操作来执行与 load 操作等效的操作,但在更高级别的构造上进行操作。通过将内存顺序指定为运行时参数,高级负载可以将用户提供的内存顺序参数传递给提供排序所需的低级原子操作,而高级操作不必是模板。

通常情况下,原子指令是内联的,如果内存顺序参数实际上是编译时常量,编译器会消除对内存顺序参数的测试。

关于c++ - 为什么 memory_order 作为 std::atomic 函数的运行时参数给出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com