下面的函数是否总是在写入 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 和编译器它们不允许对同步点周围的任何加载/存储进行重新排序,以便所有 x 数组操作在任何 y 数组操作开始之前完成。我需要分离读/写 block ,这样Kahan-Summation 等算法就不会被编译器或 CPU 的重新排序破坏。
最佳答案
对于单线程应用程序,这些都不重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按该顺序发生。只有在跨多个线程和内核共享数据时,这些东西才重要。
关于c++ - std::mutex 是否足以使所有先前的读写发生在同一线程中的后续读写之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240780/