c++11 atomic使用几点注意事项

第一次使用atomic,且只是入门级使用,初步发现有以下几点要注意

  1. 不能直接传结构体类型,以此希望对整个结构体成员的操作都是原子性的,比如:
	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;
  1. 重载操作符+=,只对整形和指针型有效,对浮点型无效,会导致编译报错: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;
  1. 通过引用传参将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 补充

  1. 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
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的`<stdatomic.h>`库提供了原子操作接口,用于实现线程安全的原子操作。原子操作是不可被中断的,即在执行原子操作期间不会有其他线程干扰。 在C11标准中,`<stdatomic.h>`库引入了一组原子类型和原子操作函数。这些原子类型和函数可以用于实现共享变量的原子访问、更新和同步。 下面是一些常用的原子类型和相关函数: 1. `atomic_flag`类型:用于简单的原子标志操作,只有两个操作:`atomic_flag_test_and_set()`和`atomic_flag_clear()`。 2. 原子整型类型(如`atomic_int`、`atomic_uint`等):支持常见的整型操作,如赋值、加法、减法、比较交换等。 3. 原子指针类型(如`atomic_intptr_t`、`atomic_ptrdiff_t`等):支持指针类型的原子操作,如原子加载、存储和比较交换等。 4. `atomic_thread_fence()`函数:用于实现内存屏障,确保指令重排序不会破坏多线程程序的正确性。 5. `atomic_load()`和`atomic_store()`函数:用于原子加载和存储操作。 6. `atomic_exchange()`函数:用于原子交换操作,可以原子地交换一个值并返回旧值。 7. `atomic_compare_exchange_strong()`和`atomic_compare_exchange_weak()`函数:用于原子比较并交换操作,可以原子地比较并交换一个值。 通过使用这些原子类型和函数,我们可以实现线程安全的并发操作。注意,原子操作并不意味着完全的线程同步,额外的同步机制(如互斥锁)可能仍然是必需的来确保正确的并发访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值