use*_*710 21 c++ multithreading atomic c++11
我在一个交叉点,我试图在基于互斥锁的数据结构和无锁(可能无等待)的数据结构之间选择一个.
虽然挖掘得更深,但我没有发现C++ 11标准支持原子类型的原子操作这一事实,甚至对于基于宽度的积分也没有atomic_uint32_t.换句话说,它不仅仅是未被授予真正原子的std::atomic<>接口,唯一看起来它被赋予整个标准库中的原子的东西是.std::atomic_flag
这是真的还是我遗失了什么?这是什么原因?我的意思是标准称为"原子"的东西显然根本不是原子的,甚至允许使用互斥锁或阻止呼叫.
Die*_*ühl 12
C++标准不保证std::atomic<T>操作是原子的.但是,您可以使用std::atomic<T>::is_lock_free()以查明是否无std::atomic<T>锁操作29.6.5 [atomics.types.operations.req]第7段:
返回:如果对象的操作是无锁的,则返回true,否则返回false.
如果它不是无锁的,它仍然会执行所需的同步,但它会使用一些锁来执行此操作.
Jus*_*Sid 10
如果原子是你的意思,使用没有锁的硬件支持,那么是的,标准并没有给你一个保证.为什么?好吧,因为不同的架构支持不同类型的硬件原子性.std::atomic<>有一个方便的is_lock_free()方法,可以用来检查给定的对象实际上是无锁,或内部使用锁来保证原子操作.您可以使用它并检查您的目标硬件是否无锁,然后决定要采用的数据结构.
然而,话虽如此,如果目标架构对您感兴趣的固定宽度积分的原子操作有硬件支持,并且您没有从贫民窟的阴暗软件商店获得标准库的副本,那么可能打算使用硬件而不是完全锁定.
| 归档时间: |
|
| 查看次数: |
3082 次 |
| 最近记录: |