C++ 结构专用的原子类型如何可以是无锁的?
我发现以下代码,输出总是:C++ 结构专用的原子类型如何可以是无锁的?,c++,multithreading,c++11,atomicity,C++,Multithreading,C++11,Atomicity,我发现以下代码,输出总是: std::atomic<A> is lock free? false std::atomic<B> is lock free? true std::atomic是无锁的吗?假的 原子是无锁的吗?真的 代码如下: struct A { int a[100]; }; struct B { int x, y; }; int main() { std::cout << std::boolalpha &
std::atomic<A> is lock free? false
std::atomic<B> is lock free? true
std::atomic是无锁的吗?假的
原子是无锁的吗?真的
代码如下:
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';
}
结构A{inta[100];};
结构B{intx,y;};
int main()
{
std::cout在注释部分对此进行了详细解释。内存对齐和寄存器大小可能允许以原子方式处理2个压缩的int。换句话说,2个对齐的int与具有128位寄存器的64位系统上的单个long-long没有什么不同。
std::atomic
要求其模板参数可以轻松复制。这就是是的,它知道(装载、存储等)结构B
上的操作只需复制字节,如果字节足够宽,可以使用适当的原子指令来完成。假设您的硬件能够在足够宽的范围内执行原子指令,可以容纳两个int
s?这与无锁性有什么关系?@KerrekSB由于可复制性很小编译器可以在原子类型上支持无锁操作,前提是该体系结构具有足够宽的原子指令。如果需要调用副本构造函数,那么一般来说,我认为编译器无法找出如何使其无锁。好的,但这有点出轨,因为OP的反例也很琐碎。。。