gpt4 book ai didi

c++ - memory_order_relaxed 的使用

转载 作者:可可西里 更新时间:2023-11-01 18:38:26 26 4
gpt4 key购买 nike

Stackoverflow 上已经有一些问题本质上是关于 memory_order_relaxed 的用例,例如:

Understanding memory_order_relaxed

What are some use cases for memory_order_relaxed

但是,我仍然对 memory_order_relaxed 的精确语义感到困惑。通常,memory_order_relaxed 的示例用例类似于 std::shared_ptr - 基本上它保留一个原子计数器,但不需要与其他线程同步。

好的,那么我的理解是这样的:

std::memory_order_relaxed,当与 load() 一起使用时,仅保证加载它的线程将以原子方式执行 - 它不保证任何顺序对同一变量执行 store() 操作的其他线程,它绝对不保证任何非原子变量的加载/存储(即不会生成内存栅栏。)

但是 memory_order_relaxed 是否提供任何类型的“先于发生”类型排序能力,单个原子值?例如,如果我们有:

std::atomic_flag x = ATOMIC_FLAG_INIT;

// Thread A:
//
if (!x.test_and_set(std::memory_order_relaxed)) {
std::cout << "Thread A got here first!" << std::endl;
}

// Thread B:
//
if (!x.test_and_set(std::memory_order_relaxed)) {
std::cout << "Thread B got here first!" << std::endl;
}

在上面的示例中,即使我们使用了 memory_order_relaxed,我们是否也提供了一种有保证的方式来推理此处的排序?换句话说,线程 A 和线程 B 都可以推断出哪个线程首先设置了标志。只是,由于顺序松散,线程 A 和线程 B 都不能假设任何周围的非原子共享变量的值,因为没有内存栅栏。或者我在这里不正确?

最佳答案

你是对的。正如您所指出的,有些用例(例如计数器)是可以的。

关于c++ - memory_order_relaxed 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31192131/

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