std :: mutex是否足以使所有先前的读写操作在跟随读写之前发生在同一个线程中?

时间:2018-01-13 14:25:47

标签: c++ mutex memory-fences

在写入y [100]之前,跟随函数是否始终写入x [100]?

void fenceTest(float * x, float * y /* this could be x too*/)
{
    x[100]=3.14f; // maybe atomic write
    x[200]=3.14f;
    myMutex.lock();
    myMutex.unlock(); 
    y[100]=2.72f; // maybe atomic write too
    y[200]=2.72f;
}

或mutex需要在终点之后解锁,即使对于这个单线程场景也是如此,或者我们是否必须使用atomic_thread_fence?

void fenceTest(float * x, float * y)
{
    x[100]=3.14f; // maybe atomic too
    x[200]=3.14f;
    std::atomic_thread_fence(std::memory_order_relaxed);
    y[100]=2.72f; // maybe atomic write too
    y[200]=2.72f;
}

我的目的是告诉CPU和编译器他们不允许重新排序同步点周围的任何加载/存储,以便在任何y数组操作开始之前完成所有x-array操作。我需要分离读/写块,以便 Kahan-Summation 等算法不会被编译器或CPU的重新排序打破。< / p>

1 个答案:

答案 0 :(得分:2)

对于单线程应用程序,这一点都不重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按此顺序发生。只有当数据在多个线程和核心之间共享时,这一点才有意义。