C++11多线程:原子操作std::automic-用于多个线程之间共享的变量。
系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、std::automic
- 二、使用步骤
-
- 1.代码案例
- 总结
前言
一、std::automic
std::atomic
来代表原子操作,std::automic
是个类模板。其实std::atomic这个东西是用来封装某个类型的值的。
1.1 原子操作概念引出范例
互斥量:多线程编程中 保护共享数据:先锁,操作共享数据,开锁
有两个线程,对一个变量进行操作,这个线程读该变量值,另一个线程往这个变量中写值。
int atomvalue = 5;
//读线程A
int tmpvalue = atomvalue;
//这里这个atomvalue代表的是多个线程之间共享的变量;
//写线程B
atomvalue = 6;
1.2 汇编代码的话;
大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式
- 原子操作:在多线程中 不会被打断的 程序执行片段;原子操作,比互斥量效率上更胜一筹。
- 互斥量的加锁一般是针对一个代码段(几行代码),而原子操作针对的一般是一个变量,而不是一个代码段;
- 原子操作:一般都是指“不可分割的操作”;也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态;
二、使用步骤
1.代码案例
代码如下(示例):
//int g_mycout = 0; //定义一个全局变量
std::atomic<int> g_mycout = 0; //我们封装了一个类型为int的对象(值);我们可以像操作一个int类型变量一样来操作这个g_mycout//std::mutex g_my_mutex; //互斥量void mythread03() //线程入口函数
{for (int i = 0; i < 100000; i++){//g_my_mutex.lock();//7秒钟实现了2000万次的加锁和解锁;//g_mycout++;//...//...//g_my_mutex.unlock();g_mycout++;//cout <<""//对应的操作是原子操作(不会被打断)}return;
}int main()
{//三:原子操作std::automic//(3.1)原子操作概念引出范例//互斥量:多线程编程中 保护共享数据:先锁,操作共享数据,开锁//有两个线程,对一个变量进行操作,这个线程读该变量值,另一个线程往这个变量中写值。//int atomvalue = 5;读线程A//int tmpvalue = atomvalue;//这里这个atomvalue代表的是多个线程之间共享的变量;写线程B//atomvalue = 6;//汇编代码的话;//大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式//原子操作:在多线程中 不会被打断的 程序执行片段;原子操作,比互斥量效率上更胜一筹。//互斥量的加锁一般是针对一个代码段(几行代码),而原子操作针对的一般是一个变量,而不是一个代码段;//原子操作:一般都是指“不可分割的操作”;也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态;//std::atomic来代表原子操作,std::automic是个类模板。其实std::atomic这个东西是用来封装某个类型的值的;//(3.2)基本的std::atomicstd::thread myobj1(mythread03);std::thread myobj2(mythread03);cout << "线程开始!" << g_mycout<< endl;myobj1.join();cout << "thread_myobj1 end!" << g_mycout << endl;myobj2.join();cout << "thread_myobj2 end!" << g_mycout << endl;cout << "两个线程执行完毕,最终的g_mycout的结果是:" << g_mycout << endl;return 0;
}
运行截图:
总结
- 了解std::automic的基本概念和使用;
- 了解与互斥量的区别;
- 什么是原子操作?