我找到了以下代码,输出总是:
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';
}
我不明白第二个结构专用原子类型如何能够自由锁定并且第一个专用原子类型不能无锁?
提前致谢。
答案 0 :(得分:5)
http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free在评论部分真正解释了这一点。内存对齐和寄存器大小可以允许以原子方式处理2个压缩的int。换句话说,在具有128位寄存器的64位系统上,2个对齐的整数与单个长整数不同。
答案 1 :(得分:2)
std::atomic
要求其模板参数可以轻易复制。也就是说,它知道结构B
上的(加载,存储等)操作只是复制字节,如果它们足够宽,可以用适当的原子指令完成。