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
么,这里不太懂。