Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构专用的原子类型如何可以是无锁的?_C++_Multithreading_C++11_Atomicity - Fatal编程技术网

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的反例也很琐碎。。。