c++ - 如何测试 std::memory_order_relaxed 的行为?

标签 c++ multithreading stl atomic memory-barriers

我已经阅读了 std::memory_order_relaxed 的文档.

Relaxed ordering 的部分解释是......

// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
// Thread 2:
r2 = x.load(memory_order_relaxed); // C 
y.store(42, memory_order_relaxed); // D

对此的解释是……

[It] is allowed to produce r1 == r2 == 42. In particular, this may occur if D is completed before C in thread 2, either due to compiler reordering or at runtime.

我理解了解释,尝试在我的电脑上测试如下代码:

std::atomic<int> x = {0};
std::atomic<int> y = {0};

int r1, r2;

void task1() {
    // Thread 1:
    r1 = y.load(memory_order_relaxed); // A
    x.store(r1, memory_order_relaxed); // B
}

void task2() {
   // Thread 2:
    r2 = x.load(memory_order_relaxed); // C 
    y.store(42, memory_order_relaxed); // D
}


int main()
{
    std::thread t2 (task2);
    std::thread t1 (task1);

    t1.join();
    t2.join();

    cout << "r1: " << r1
        << "\nr2: " << r2 << endl;

    return 0;
}

这段代码的结果是never r1 == r2 == 42,据说这是该文档中的一种可能行为。

这段代码有没有错误?或者,有什么误会吗?

最佳答案

Or, is there any misunderstanding?

是的,有一个。 std::memory_order_relaxed 在您的程序中允许的是针对架构的实现(编译器),以生成可以观察到副作用的程序 r1 == r2 == 42.

实现不必产生这样的程序,这样的程序也不必产生​​那种副作用;无论如何,这是一个可能的结果。

How to test the behavior of std::memory_order_relaxed?

我看不到这个问题的通用解决方案。您只能检查 观察到的副作用是否与 std::memory_order_relaxed 的规范相匹配。

关于c++ - 如何测试 std::memory_order_relaxed 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52199869/

相关文章:

c++ - 128 位数字的位移位运算

java - Android Thread 并发运行的线程之间通知

c# - Parallel.foreach 不处理所有项目

c++ - 调用 std::vector::clear() 会将 std::vector::capacity() 设置为零吗?

c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

c++ - 有什么方法可以检查迭代器是否有效?

c++ - 模板类方法中的递归 std::function 定义

c++ - std::mutex 如何在不同的线程中解锁?

c++ - 删除 opencv 和 c++ 中的边界线

java - JButton 按下时线程抛出异常