c++11 如何插入简单的内存屏障?

标签 c++ multithreading c++11

我想插入简单的内存屏障,即 C# Thread.MemoryBarrier(); 的模拟。 我如何在 C++ 上执行此操作? :

这是我要修改的代码:

volatile uint32_t curWriteNum;

void ObtainAndCommit(T* val) {
    memcpy(&storage[curWriteNum & MASK], val, sizeof(T));
     // Ensure storage is written before mask is incremented
     // insert memory barrier
     ++curWriteNum;
}

更新

当我发布这个问题时,我只是想知道如何插入内存屏障。但现在我们似乎在讨论如何使我的程序有效,所以我添加了指向类的完整列表的链接 one reader / one writer no-memory-allocation lock-free ring-buffer .

最佳答案

增量应该具有释放语义,以便所有先前写入的效果不会在增量之后重新排序。

只需声明curWriteNum作为std::atomic<int> .递增 std::atomic<int>具有释放语义。事实上,它有 memory_order_seq_cst语义,比 release 强。更准确地说,您需要 curWriteNum.fetch_add(1, std::memory_order_release) .

在读者端,您应该将值读为 int n = curWriteNum; ,或者更准确地说,int n = curWriteNum.load(std::memory_order_acquire); .

参见 std::memory_order更多细节。此外,深度视频 C++ and Beyond 2012: Herb Sutter - atomic<> Weapons, 1 of 2 .

关于c++11 如何插入简单的内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166073/

相关文章:

c++ - 函数计算一个字母出现在句子中的概率

java - 什么原语用于实现 synchronized 关键字?

java - 使用 Runnable 多线程运行一个方法

c++ - 如何实现递归 MRSW 锁?

c++ - 如何从源代码构建单线程TensorFlow 2.x

c++ - 在编译时将 std::array 的每个元素相乘

c++ - 为什么构造函数不使用 WinAPI 执行所有代码?

c++ - 来自 C 数组的 STL 数组,无需复制

gcc - c++11 std::array of std::atomic 零初始化编译失败?

c++ - 如何映射 Linux 系统线程 id 和 std::thread::id?