std::mutex 是否足以使所有先前的读写发生在同一线程中的所有后续读写之前?

Is std::mutex enough for making all prior reads-writes happen before following reads-writes all in same thread?

以下函数是否总是在写入 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;
}

或者即使对于这种单线程场景,也始终需要在结束点后解锁互斥锁,或者我们是否必须使用 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 和编译器他们不允许在同步点周围重新排序任何 load/store 以便所有 x 数组操作在任何 y 数组操作之前完成开始。我需要将 reads/writes 的块分开,这样 Kahan-Summation 等算法就不会 被编译器或 CPU 的重新排序[破坏] =21=].

对于单线程应用程序 none 这很重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按该顺序发生。只有当数据在多个线程和内核之间共享时,这些东西才重要。