C++ 11 标准是否保证 std::atomic<> 作为无锁操作实现?
Does the C++ 11 standard guarantees that std::atomic<> is implemented as a lock-free operation?
我处于一个交汇点,我试图在基于互斥锁的数据结构和无锁(可能无等待)的数据结构之间选择一个。
在深入挖掘时,我没有发现关于 C++11 标准是否支持原子类型的无锁操作的消息,甚至不支持像 atomic_uint32_t
这样的基于宽度的积分。换句话说,不仅仅是std::atomic<>
接口没有被授予无锁;在整个标准库中,唯一看起来像是无锁的就是 std::atomic_flag
.
这是真的还是我错过了什么?这是什么原因呢?我的意思是,该标准称"原子"的东西显然根本不是无锁的,甚至允许在引擎盖下使用互斥体或阻止调用。
C++标准不保证std::atomic<T>
操作是无锁的。但是,您可以使用std::atomic<T>::is_lock_free()
来了解std::atomic<T>
的操作是否无锁定 29.6.5 [atomics.types.operations.req] 第 7 段:
返回:如果对象的操作是无锁的,则为 true,否则为 false。
如果它不是无锁的,它仍将执行所需的同步,但它使用一些锁来执行此操作。
如果您所说的原子是指使用没有锁的硬件支持,那么是的,该标准并不能为您提供保证。为什么?嗯,因为不同的架构支持不同类型的硬件原子性。 std::atomic<>
具有方便的is_lock_free()
方法,可用于检查给定对象是否实际上没有锁定,或者在内部使用锁定来保证原子操作。您可以使用它并检查您的目标硬件是否无锁定,然后决定要采用哪种数据结构。
但是,话虽如此,如果目标架构对您感兴趣的固定宽度积分具有原子操作的硬件支持,并且您没有从贫民窟的阴暗软件商店获得标准库的副本,那么它可能会使用硬件而不是完全成熟的锁。
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 如何实现对序列对进行操作的C++元函数
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 在 c++ 中实现内联汇编器以对变量进行异或操作的正确方法
- 在最少的操作中实现字符串所有字符的相同频率。(所有字符的范围从'a'到"z")
- 了解C++位操作中的二进制转换实现
- 是否可以通过一个模板函数实现列操作和行操作?
- 如何实现原子操作
- 这个指针增量操作在这里实现了什么
- 用Win32/C API更改Windows 7壁纸(未实现操作异常)
- 如何在 32 位体系结构的最低级别实现 64 位类型和操作?
- 如何实现多线程异步操作
- 二叉树访谈:实现跟随操作
- float4::set_wxy(以及其他set-swizzle操作)的更好的SSE2实现
- SRP 是否与单个类的可能操作或其在其中的实现相关
- C++ 11 标准是否保证 std::atomic<> 作为无锁操作实现?
- 栈push操作实现不工作