c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?

标签 c++ c++11 compare-and-swap

InterlockedCompareExchange在 Windows 中,以及 __sync_val_compare_and_swap在 gcc 中采用指针,因此我可以传入任何地址,例如指向这些函数的共享内存块。

对于非 x86 架构,我可能必须确保内存对齐以确保正确性,对于 x86(可能还有其他),我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题 (-> x86 LOCK 前缀)。

为了摆脱我的代码中一些平台相关的东西(Windows VC++ 与 GCC),我查看了 C++11 的 atomic_compare_exchange_weak。和 friend 。但它们都对 std::atomic<T>* 类型的变量起作用.

有没有办法在 C++11 的原子函数中使用任意指针?它看起来不像一个简单的 cast to std::atomic会解决这个问题。

最佳答案

简短的回答:他们不能。这对于语言的可移植性是必要的,因为 C++ 不希望要求每个平台都对一组特定的数据大小提供无锁支持。使用 std::atomic<T>使库可以轻松地为某些 T 透明地提供无锁原子性s 并为其他人使用锁。

好的一面是,替换 Tatomic<T>在您的代码库中提供了关于哪些对象用于同步的确切文档,并提供了对这些对象的意外非原子访问的保护。

长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)可能实际上在月相的正确阶段对某些实现起作用,但它是最纯粹的邪恶。

关于c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036883/

相关文章:

c++ - QMediaPlayer:发出 positionChanged() 时声音中断

c++ - 关于 c/c++ 中 fftw 的内存引用

c++ - 错误 : does not name a type (using auto)

c++ - 在 C++ 11 函数中处理非严重错误的推荐方法是什么

c++ - 原子递减 union 的数据成员?

c++ - 如何使 eclipse cdt(c++) 一键构建&运行?

c++ - 将int的所有字节都设置为(unsigned char)0,保证代表零?

c++ - 基于 compare_exchange 的循环是否受益于暂停?

c++ - 为什么 std::atomic<T>::compare_exchange_* 不应遭受 ABA 问题?

c++ - 有没有办法让这个 C++14 递归模板在 C++17 中更短?