C++的thread理解
2021/7/10 22:06:22
本文主要是介绍C++的thread理解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++11引入了最新的thread模块,在对线程的操作上进行了进一步的提升,这里设置全局变量number = 1;
int Thread_A() { while (number < 100) { //mu.lock(); //同步数据锁 cout << "thread A :" << number << endl; number++; this_thread::sleep_for(chrono::milliseconds(100)); //mu.unlock(); //解除锁定 } return 0; } int Thread_B() { while (number < 100) { //mu.lock(); //同步数据锁 cout << "thread B :" << number << endl; number++; this_thread::sleep_for(chrono::milliseconds(100)); //mu.unlock(); //同步数据锁 } return 0; }
上方构建了两个函数,分别代表线程A和线程B,分别使用join()方法,这会出现堵塞主线线程和线程访问变量出现问题
int main() { thread a(Thread_A); thread b(Thread_B); a.join(); b.join(); for (int i = 0; i < 10; i++) { cout << "Main thread is working !" << endl; this_thread::sleep_for(chrono::milliseconds(200)); } return 0; }
此时会出现问题,就是当A线程访问number时候,number已经进行赋值输出但是没有进行++操作的时候线程B访问number变量,这会出现其输出变量与A输出的是一样的,而且++进行两次后A线程输出的number+2了,正如下方的运行
所以为了避免出现该问题需要加上同步锁,也就是上方注释部分此时出现比较完美的结局
但是这个时候又有个问题,join方法会对主线程进行堵塞,所以我们需要用
a.detach(); b.detach();
但是会报错,mutex destroyed while busy,此时是由于线程访问未解锁的number报错。
这篇关于C++的thread理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解