系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、std::automic
- 二、使用步骤
- 1.代码案例
- 总结
前言
原子操作std::automic的基本概念和用法。
一、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::atomic
std::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的基本概念和使用;
- 了解与互斥量的区别;
- 什么是原子操作?