c++ - 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# - Visual Studio:将库添加到引用时,是否可以自动向 app.config 添加条目?
- javascript - 处理竞争条件:护照注册功能有效,但响应 404 错误
- python - 使用 asyncio.Queue 将数据从子进程安全地传递到异步任务
- excel - 如何创建与 Redshift 的实时 Excel 连接
- graphql - 如何使用 Apollo GraphQL 查询结果作为另一个查询的输入?又名:请求链
- apache-kafka - Kafka Streams - 它如何在内部保存状态
- php - 与基地的感情id
- gradle - 从运行时配置中排除的实现依赖性
- java - Apache Tomcat 8.5 池线程从未被杀死
- reactjs - 无法在文本框中输入 - React