首页 > 解决方案 > atomic_ref 当外部底层类型大小不是 2 的幂时

问题描述

TL;DR:如果可能的话,您是否希望atomic_ref<3 bytes struct>实现非无锁,或者通过在更大内存量上使用 CAS 或 LL/SC 来实现无锁?


当外部基础类型未按照请求的问题对齐时,它是 atomic_ref 的延续。

可能对评论来说太大了,并且与编辑原始问题的相关性不够。

我认为有可能实现atomic_ref<T>非自然原子大小的无锁。那是非二次方。

这样atomic_ref<T>可以访问对齐的内存作为更广泛的类型。大多数情况下,它必须回退到比较交换。它仍然是原子的。

它将对应于 T 的情况,当 的实现atomic<T>将传递的类型填充到最接近的原子大小时。

我认为P0091明确允许跳过此步骤,并且atomic_ref<T>仅适用于自然原子大小:

注意: atomic 的实现是否是无锁的,并不一定限制 atomic_ref 的对应实现是否是无锁的。——尾注

但预期的是什么?

(我知道 compare-exchange 不如普通存储或交换高效,但我仍然认为它比基于锁的效率更高,并且通过这种atomic_ref加载实现甚至可以作为普通加载实现)


例子:

struct S { char a, b, c; };
std::cout << std::boolalpha << std::atomic<S>::is_always_lock_free << '\n'; // I expect true
std::cout << std::boolalpha << std::atomic_ref<S>::is_always_lock_free << '\n'; // What should I expect?

标签: c++c++20stdatomic

解决方案


推荐阅读