C++ error: undefined reference to `__atomic_is_lock_free‘

1. 报错现象

在这里插入图片描述
错误示例代码:

#include <atomic>
#include <iostream>

struct A{
  int a, b, c;
};
int main()
{
    std::atomic<A> b;
    std::cout << b.is_lock_free() << std::endl;
}

2. 问题分析

原因是atomic对象不是lock_free的,会导致is_lock_free函数编译不过。
对于常见的内置类型,比如int,double,char,long等等,都是lock_free的,可以正常调用is_lock_free函数。

#include <atomic>
#include <iostream>

int main()
{
    std::atomic<int> a;
    std::atomic<char> b;
    std::atomic<long> c;
    std::atomic<long long> d;
    std::cout << "sizeof int: " << sizeof(int) << " byte,  " << a.is_lock_free() << std::endl;
    std::cout << "sizeof char: " << sizeof(char) << " byte,  " << b.is_lock_free() << std::endl;
    std::cout << "sizeof long: " << sizeof(long) << " byte,  " << c.is_lock_free() << std::endl;
    std::cout << "sizeof long long: " << sizeof(long long) << " byte,  " << d.is_lock_free() << std::endl;
}

对于自定义类型,则不一定是lock_free

#include <atomic>
#include <iostream>

struct A{
    char n[1];
};
int main()
{
    std::atomic<A> a;
    std::cout << "sizeof int: " << sizeof(int) << " byte,  " << a.is_lock_free() << std::endl;
}

测试了自定义类型struct A从1字节到>8字节的情况,发现1、2、4、8字节是lock_free的,其他时候都不是,而且is_lock_free函数编译不过,按道理说不是lock_free不应该返回false么,这里不太懂。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值