[C++] C++11 原子变量

在多线程程序中使用原子变量std::atomic可以非常方便地避免并发访问时的线程安全问题(data races),此外还可以通过指定不同的std::memory_order指定线程间数据同步的粒度。

原子变量

template <class T> struct atomic;

常用方法:

	void store (T val, memory_order sync = memory_order_seq_cst);	// 修改值
	T load (memory_order sync = memory_order_seq_cst);				// 赋值
	T exchange (T val, memory_order sync = memory_order_seq_cst);	// 获取值的同时修改值
	
	T fetch_add (T val, memory_order sync = memory_order_seq_cst);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11中引入了原子操作库`<atomic>`,提供了一组原子类型和原子操作函数,用于在多线程环境下对共享数据进行保护。原子操作是指在执行过程中不能被中断的操作,因此可以保证在多线程环境下,对共享数据的操作不会被其他线程干扰,从而避免了竞争问题。 原子类型是指可以被原子操作读写的类型,包括整型、指针类型等。常见的原子类型有`std::atomic<int>`、`std::atomic<long>`、`std::atomic<void*>`等。原子类型的操作函数包括读取、存储、交换、比较等。例如,`std::atomic<int>`类中常用的操作函数有: - `load()`:读取原子变量的值 - `store(val)`:将原子变量的值设置为`val` - `exchange(val)`:将原子变量的值交换为`val`,并返回原来的值 - `compare_exchange_strong(expected, val)`:如果原子变量的值等于`expected`,则将其设置为`val`,并返回`true`,否则不修改原子变量的值,返回`false` - `compare_exchange_weak(expected, val)`:与`compare_exchange_strong`类似,但是在某些平台上可能比较快 使用原子操作时需要注意以下几点: 1. 原子操作只能用于原子类型,不能用于非原子类型。 2. 在多线程环境下,对共享数据的读写应该使用原子操作,避免竞争问题。 3. 原子操作不一定比互斥锁更快,因此在实际使用时应该根据具体情况进行选择。 下面是一个使用原子变量的示例: ```c++ #include <iostream> #include <atomic> #include <thread> std::atomic<int> counter(0); void increment() { for (int i = 0; i < 1000000; ++i) { ++counter; } } int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Counter: " << counter << std::endl; return 0; } ``` 在上面的示例中,我们创建了一个`std::atomic<int>`类型的原子变量`counter`,并在两个线程中进行加1操作,最终输出`counter`的值。由于原子变量的操作是原子的,因此这个程序的输出结果应该是2000000,即两个线程总共对`counter`进行了2000000次加1操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值