C++11原子操作的经典代码以及讲解
C++11中的原子操作可以保证在多线程环境下的数据访问安全。下面是C++11中所有原子操作的经典代码以及讲解。
-
原子加载操作
原子加载操作可以保证从共享内存中读取数据时不会被其他线程干扰,以下是经典代码:
std::atomic<int> a(0);
int x = a.load(std::memory_order_relaxed);
这里使用了load()
方法来实现原子加载操作,第一个参数是内存模型,这里使用了最轻量级的std::memory_order_relaxed
,因为我们只需要确保数据的正确性,而不需要保证顺序性。
-
原子存储操作
原子存储操作可以保证向共享内存写入数据时不会被其他线程干扰,以下是经典代码:
std::atomic<int> a(0);
a.store(42, std::memory_order_relaxed);
这里使用了store()
方法来实现原子存储操作,第一个参数是要写入的值,第二个参数同样是内存模型。
-
原子交换操作
原子交换操作可以保证在多线程环境下对一个变量进行赋值时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0);
int x = 42;
int y = a.exchange(x, std::memory_order_relaxed);
这里使用了exchange()
方法来实现原子交换操作,第一个参数是要写入的值,第二个参数同样是内存模型。这段代码会将变量a
的值赋给变量y
,然后将变量a
的值设置为x
。
-
原子比较和交换操作
原子比较和交换操作可以保证在多线程环境下对一个变量进行读取、比较和赋值时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0);
int x = 42;
int y = 0;
a.compare_exchange_strong(y, x, std::memory_order_relaxed);
这里使用了compare_exchange_strong()
方法来实现原子比较和交换操作,第一个参数是要修改的值的指针,第二个参数是期望的值,第三个参数同样是内存模型。如果当前值等于期望值,则将当前值修改为新值。
-
原子加法操作
原子加法操作可以保证在多线程环境下对一个变量进行加法操作时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0);
a.fetch_add(42, std::memory_order_relaxed);
这里使用了fetch_add()
方法来实现原子加法操作,第一个参数是要加上的值,第二个参数同样是内存模型。这段代码会将变量a
的值加上42。
-
原子减法操作
原子减法操作可以保证在多线程环境下对一个变量进行减法操作时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0);
a.fetch_sub(42, std::memory_order_relaxed);
这里使用了fetch_sub()
方法来实现原子减法操作,第一个参数是要减去的值,第二个参数同样是内存模型。这段代码会将变量a
的值减去42。
-
原子与操作
原子与操作可以保证在多线程环境下对一个变量进行与操作时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0xff);
a.fetch_and(0x0f, std::memory_order_relaxed);
这里使用了fetch_and()
方法来实现原子与操作,第一个参数是要与操作的值,第二个参数同样是内存模型。这段代码会将变量a
的值与0x0f进行与操作。
-
原子或操作
原子或操作可以保证在多线程环境下对一个变量进行或操作时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0xf0);
a.fetch_or(0x0f, std::memory_order_relaxed);
这里使用了fetch_or()
方法来实现原子或操作,第一个参数是要或操作的值,第二个参数同样是内存模型。这段代码会将变量a
的值与0x0f进行或操作。
-
原子异或操作
原子异或操作可以保证在多线程环境下对一个变量进行异或操作时不会出现竞争条件,以下是经典代码:
std::atomic<int> a(0xff);
a.fetch_xor(0xf0, std::memory_order_relaxed);
这里使用了fetch_xor()
方法来实现原子异或操作,第一个参数是要异或操作的值,第二个参数同样是内存模型。这段代码会将变量a
的值与0xf0进行异或操作。
总结:以上是C++11中所有的原子操作以及对应的经典代码,使用这些操作可以有效地保证多线程环境下数据访问的安全性。
本文福利, 免费领取C++学习资料包、技术视频/代码,内容包括(C++基础,网络编程,数据库,中间件,后端开发,音视频开发,Qt开发)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
相关文章
- 女朋友问我:什么时候用 C 而不用 C++?
- EasyC++32,引用的使用(上)
- c++ auto类型_auto C++
- Ubuntu如何安装vscode_ubuntu20.0.4 vscode配置c++环境
- C++拷贝构造函数
- Java 和 C++ 之间的相似之处
- c++的链表-C++实现简单链表
- C++如何简单快速去除容器中的重复元素
- C++ Boost库 实现命令行解析
- 【C++修炼之路】21.红黑树封装map和set
- C++构造函数、析构函数和变量的生存期
- C++ string支持配置器方法详解
- C++ STL array容器和普通数组的比较
- C++中抽象类和接口的区别介绍
- 一道超经典的C++结构体的题目
- C++异常处理catch(...)介绍
- C++实现多线程查找文件实例
- C++实现汉诺塔算法经典实例