struct 专用原子类型如何无锁?

Posted

技术标签:

【中文标题】struct 专用原子类型如何无锁?【英文标题】:How can the struct specialized atomic type be lock free? 【发布时间】:2017-09-01 20:43:21 【问题描述】:

我找到以下代码,输出总是:

std::atomic<A> is lock free? false
std::atomic<B> is lock free? true

这是代码:

struct A  int a[100]; ;
struct B  int x, y; ;
int main()

    std::cout << std::boolalpha
              << "std::atomic<A> is lock free? "
              << std::atomic<A>.is_lock_free() << '\n'
              << "std::atomic<B> is lock free? "
              << std::atomic<B>.is_lock_free() << '\n';

我不明白第二个 struct 专门的原子类型怎么可以是无锁的,而第一个专门的原子类型不能是无锁的?

提前致谢。

【问题讨论】:

大概你的硬件能够执行足够宽的原子指令,可以容纳两个ints? 【参考方案1】:

http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free 真的在评论区解释了。内存对齐和寄存器大小可能允许以原子方式处理 2 个打包整数。换句话说,2 个对齐的 int 与具有 128 位寄存器的 64 位系统上的单个 long long 没有什么不同。

【讨论】:

【参考方案2】:

std::atomic 要求其模板参数可轻松复制。也就是说,它知道你的结构B 上的(加载、存储等)操作只是复制字节,并且可以使用适当的原子指令来完成,如果它们足够宽的话。

【讨论】:

这与无锁有什么关系? @KerrekSB 由于微不足道的可复制性,只要体系结构具有足够宽的原子指令,编译器就可以支持对原子类型的无锁操作。如果需要调用复制构造函数,那么通常我认为编译器无法弄清楚如何使其无锁。 好的,但这有点出轨,因为OP的反例也是微不足道的......

以上是关于struct 专用原子类型如何无锁?的主要内容,如果未能解决你的问题,请参考以下文章

原子操作类原子操作类详细介绍

没有原子的 SPSC 无锁队列

无锁的原子函数改变两个独立的内存位置

Redis学习笔记29——无锁的原子操作:Redis如何应对并发访问

Redis学习笔记29——无锁的原子操作:Redis如何应对并发访问

在 C++11 中以无锁方式原子交换两个 std::atomic<T*> 对象?