gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:04 51 4
gpt4 key购买 nike

我想插入简单的内存屏障,即 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/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com