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

标签 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;
}

或者即使对于这种单线程场景,也始终需要在终点后解锁互斥量,或者我们是否必须使用 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/

相关文章:

c++ - 自定义条件作用域互斥锁

c++ - 将互斥量数组传递给函数时出现错误 C2664

c++ - 原子递减比递增更昂贵吗?

c++ - contiguous_range始终是size_range吗?

c++ - ZeroMQ 中的 SUB 订阅者是否像 ROS 中那样具有任何 "callback"机制?

c++ - 如何从 C++ 中的另一个头文件调用函数?

c# - 在不知道进程启动顺序的情况下在另一个进程上触发事件

c# - 关键部分可以无限期地停止处理器吗?

memory - 关于使用 mfence/lfence/sfence 对第二个线程可见的锁中的数据修改的 Peterson 算法

c++ - 有什么方法可以创建一种指针类型,该指针类型可以指向具有不同 Comp 模板参数的集合?