gpt4 book ai didi

c++ - 如何保证加载在存储发生之前完成?

转载 作者:行者123 更新时间:2023-12-01 14:53:28 24 4
gpt4 key购买 nike

在下面的代码中,如何确保ptr在* ptr被加载/分配/“提取”之后才增加?

extern int arr[some_constexpr]; // assume pre-populated
extern int* ptr; // assume points to non-atomic arr
int a = *ptr;
// want "memory barrier/fence" here
++ptr;

原子指针会确保正确的排序/排序吗?
#include <atomic>

extern int arr[some_constexpr];
extern std::atomic<int*> ptr;
int a = *(ptr.load());
// implicit "memory barrier" achieved here by use of atomics?
ptr.store(ptr + 1);

这涉及两个线程之间共享的无锁队列。我要确保与指针关联的数据在更新指针之前不会丢失/损坏。

最佳答案

ptrstd::atomic<int*>++ptrptr++ptr.fetch_add(1, std::memory_order_acq_rel)时,请确保在此操作之前/之后,没有对之前/之后的加载/存储进行重新排序。
++ptrptr++本质上是ptr.fetch_add(1, std::memory_order_seq_cst),而std::memory_order_seq_cst几乎总是一个矫kill过正的地方(无法举个例子,事实并非如此)。

效率更高的单一阅读器是:

int arr[some_constexpr];
std::atomic<int*> ptr;

int* p = ptr.load(std::memory_order_acquire);
int element = *p;
ptr.store(p + 1, memory_order_release);

上面基本上是 boost::lockfree::spsc_queue的实现方式。

附带说明一下, boost::lockfree::spsc_queue是一个真正的 wait-free(最严格的进度非阻塞保证)队列。 push/ pop操作要做的是1个 relaxed加载,1个 acquire加载和1个 release存储,从根本上讲,不可能实现比FIFO顺序保证的单生产者-单消费者队列更快的速度(无实现质量缺陷)。它通常用作 benchmark for all other queues。您可能想研究一下。

关于c++ - 如何保证加载在存储发生之前完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60420163/

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