【问题标题】:How can the struct specialized atomic type be lock free?struct 专用原子类型如何无锁?
【发布时间】:2023-03-24 14:54:02
【问题描述】:

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

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?

标签: c++ multithreading c++11 atomic


【解决方案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的反例也是微不足道的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2012-04-23
    • 2010-10-01
    相关资源
    最近更新 更多