gpt4 book ai didi

c++ - 非原子类型如何实现std::atomic_ref?

转载 作者:行者123 更新时间:2023-12-04 06:30:30 26 4
gpt4 key购买 nike

我想知道如何为非原子对象有效地实现 std::atomic_ref (每个对象一个std::mutex),因为以下属性似乎很难实现:

Atomic operations applied to an object through an atomic_ref are atomic with respect to atomic operations applied through any other atomic_ref referencing the same object.



特别是以下代码:
void set(std::vector<Big> &objs, size_t i, const Big &val) {
std::atomic_ref RefI{objs[i]};
RefI.store(val);
}

似乎很难实现,因为每次在相同的 std::atomic_ref上都需要选择 std::mutex(除非它是由相同类型的所有对象共享的大主锁)。

我想念什么吗?还是每个对象都有责任实现 std::atomic_ref,因此是原子的还是带有 std::mutex的?

最佳答案

该实现与std::atomic<T>本身几乎完全相同。这不是一个新问题。

请参见Where is the lock for a std::atomic?std::atomic/std::atomic_ref的典型实现是针对非无锁对象的按地址索引的静态静态哈希表。哈希冲突只会导致额外的竞争,而不会带来正确性问题。 (死锁仍然是不可能的;该锁仅由原子函数使用,从不尝试一次占用2个。)

例如,在GCC上,std::atomic_ref只是在对象上调用__atomic_store的另一种方法。 (请参阅GCC manual: atomic builtins)

编译器知道T是否足够小,可以无锁。如果没有,它将调用使用该锁的libatomic库函数。

(有趣的事实:这意味着仅当对象具有足够的atomic<T>对齐方式时才有效。但是在包括x86在内的许多32位平台上,uint64_t可能仅具有4字节对齐方式。此类对象上的atomic_ref可以编译并运行,但实际上无法如果编译器在32位模式下使用SSE 8字节加载/存储来实现它,将是原子的。幸运的是,对于像alignof(T) == sizeof(T)这样的对象,就像在64位体系结构上的大多数原始类型一样,没有危险。

关于c++ - 非原子类型如何实现std::atomic_ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58346307/

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