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 专门的原子类型怎么可以是无锁的,而第一个专门的原子类型不能是无锁的?
提前致谢。
【问题讨论】:
大概你的硬件能够执行足够宽的原子指令,可以容纳两个int
s?
【参考方案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 专用原子类型如何无锁?的主要内容,如果未能解决你的问题,请参考以下文章
Redis学习笔记29——无锁的原子操作:Redis如何应对并发访问