std::atomic_compare_exchange_* 等如何与任意指针一起使用
How can std::atomic_compare_exchange_* etc. be used with arbitrary pointers?
Windows 中的
InterlockedCompareExchange
,以及 gcc 中的__sync_val_compare_and_swap
take 指针,因此我可以传入任何地址,例如指向共享内存块到这些函数中。
对于 x86(可能还有其他(,我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题(-> x86 LOCK
前缀(。
为了摆脱代码中一些依赖于平台的东西(Windows VC++与GCC(,我看了一下C++11的atomic_compare_exchange_weak
和朋友。但它们都处理 std::atomic<T>*
类型的变量。
有没有办法使用具有 C++11 原子函数的任意指针?看起来不像是一个简单的std::atomic可以解决这个问题。
简短的回答:他们不能。这对于语言的可移植性是必要的,因为C++不希望要求每个平台都对一组特定的数据大小提供无锁支持。使用 std::atomic<T>
使库可以轻松地为某些T
透明地提供无锁原子性,并为其他使用锁。
从好的方面来说,将代码库中的T
替换为atomic<T>
提供了准确用于同步的对象的文档,并防止意外的非原子访问这些对象。
长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)
实际上可能在月球的正确阶段进行一些实现,但这是最纯粹的邪恶。
相关文章:
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 指针可以用于访问内存中的任何任意区域吗?
- 如何动态执行具有任意参数类型的函数指针
- 定义具有任意范围的指针
- 在C++中,是否可以将任意指针作为输入参数
- 来自任意取消引用指针的输出
- C++映射是否可以包含指向我的任意类的指针
- 指向任意类方法的模板非类型指针
- 设置指向任意维度数组的指针
- 将任意数据传递给没有空指针的函数
- 将任意大小的字符串分配给指向char的指针
- 传递给sqlite_create_function任意指针的内容
- 创建一个模板化结构,以转动具有任意计数 * 的指针以用作 &
- std::atomic_compare_exchange_* 等如何与任意指针一起使用
- 在没有模板的情况下使用任意所属指针
- 如何创建一个可以容纳任意类型指针的容器?
- 在构造函数中初始化任意大小的指针数组
- 从任意Map获取指向mapped_type的指针或引用
- 为什么函数指针定义适用于任意数量的'&'号或星号"*"?