Uses of memory_order_relaxed
Uses of memory_order_relaxed
关于Stackoverflow,已经有一些问题主要是关于memory_order_relaxed
的用例,例如:
了解memory_order_relaxed
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都无法假设任何周围非原子共享变量的值,因为没有内存围栏。还是我在这里不正确?
你是对的。正如您所指出的,在某些用例(如计数器(中,这是可以的。
相关文章:
- Ascending order c++
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 为什么在与静态库链接时强制执行 order(例如 source.cxx -lstatic)
- "The order of evaluation of expressions is left to right."是什么意思
- memory_order_seq_cst操作的"happens before"关系和"precedes in a single total order"关系有什么区别?
- std::shared_ptr::owner_before 和 std::owner_less:"owner-based order"到底是什么意思?
- C++: The order of std::cout
- 如何在 std::set 中为 FIND 和 ORDER 定义不同的条件
- C++ 在结构上实现 ORDER BY
- Xcode-在项目导航器中创建新的C++文件-Order.h和.cpp-Order
- Order of cvScalar
- Xcode C++ Struct Order
- 使用c++编写带有BOM (Byte Order Mark)的csv文件
- "std::map with mutexes"与并行插入、查找、擦除之间是否有任何速度测试"libcds maps (Michael Hashmap and Split Order List)"?
- LibCds: Michael Hashmap and Split Order List