第一次使用atomic,且只是入门级使用,初步发现有以下几点要注意:
- 不能直接传结构体类型,以此希望对整个结构体成员的操作都是原子性的,比如:
struct Test_STU{
int a;
float b;
char c;
};
atomic<Test_STU> test; //错误
//但可以这样(BTW:c++11之后允许在结构体或类内初始化)
struct Test_STU{
atomic_int a{}; //初始化为默认值0
atomic<float> b{};
atomic_char c{};
};
Test_STU test;
- 重载操作符+=,只对整形和指针型有效,对浮点型无效,会导致编译报错:
error: no viable overloaded '+='
atomic<double> a;
int b = 2;
a += b; //编译报错 error: no viable overloaded '+=',因为a是浮点型
a = a + b; //正确
//以下正确
atomic<int> a;
int b = 2;
a += b;
- 通过引用传参将atomic类型作为实参传给函数时,需为常引用,否则编译器报错:
cannot bind non-const lvalue reference of type ‘int32_t& {aka int&}’ to an rvalue of type ‘std::__atomic_base<int>::__int_type {aka int}
//fun函数定义,错误
void fun(int & p_a){
cout<< p_a<<endl;
}
//main.cpp中调用fun函数
atomic<int> a{100}; //初始化为100
fun(a);//编译报错
//将fun函数修改成常引用,正确
void fun(const int & p_a){
cout<< p_a <<endl;
}
2021-6-7 补充
- atomic对象不能使用printf输出,会报错:
error: call to deleted constructor of 'std::atomic_uint8_t' (aka 'atomic<unsigned char>')
atomic:599:7: note: 'atomic' has been explicitly marked deleted here
大概意思是printf函数会隐式调用atomic类的拷贝构造函数,而atomic类禁止拷贝构造。若有错误,请路过前辈指出,谢谢!
所以用cout吧……
2021-6-8 补写
关于atomic对象的初始化和默认值。
一般atomic对象需要初始化,但测试发现,如果不初始化,其默认值和普通变量没有区别。全局的话默认初始值为0,局部的话则是一个垃圾值。网上没有找到相关的解释,官方意思是像这样的语句atomic_int a;
处于未初始化状态……不知道是不是和普通变量那样理解,虽然没初始化,好像也不影响使用。
atomic_int a;
int main()
{
atomic_int b;
cout<<"a = "<< a << " "<<"b = "<<b<<endl;
a = 100;
b = 200;
cout<<"a = "<< a << " "<<"b = "<<b<<endl;
return 0;
}
结果:
a = 0 b = 22004
a = 100 b = 200