Sil*_*ler 7 c++ multithreading atomic c++11
Stackoverflow上已经有一些基本上询问用例的问题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;
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,即使我们使用过memory_order_relaxed,我们还没有提供一种保证的方式来推理这里的订购吗?换句话说,线程A和线程B都能够推断出哪个线程首先设置了标志.只是由于放松的顺序,线程A和线程B都不能假设任何周围的非原子共享变量的值,因为没有内存栅栏.或者我在这里不正确?