2021-10-03 C++多线程编程(5) 创建多个线程、数据共享问题分析、案例代码
2021/10/3 17:40:52
本文主要是介绍2021-10-03 C++多线程编程(5) 创建多个线程、数据共享问题分析、案例代码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 创建多个线程
#include <memory> #include <iostream> #include <thread> #include <vector> void myprintf(int num) { std::cout << "Thread id = " << num << std::endl; } int main() { std::vector<std::thread> mythread; for (int i = 0; i < 10; i++) { mythread.push_back(std::thread(myprintf, i)); } for (auto it = mythread.begin(); it != mythread.end(); ++it) { it->join(); } std::cout << "Finish!!!" << std::endl; return 0; }
运行结果:
Thread id = 0 Thread id = 1 Thread id = 2 Thread id = 3 Thread id = 4 Thread id = 5 Thread id = Thread id = 7 6 Thread id = 9 Thread id = 8 Finish!!!
- 多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关;
- 主线程等待所有子线程运行结束,最后主线程结束,这种写法容易写出稳定的程序
- 将thread对象放入到容器中,这对一次性创建大量的数组管理很方便。
2. 数据共享问题分析
2.1 只读的数据
只读数据是安全稳定的,不需要什么特别的处理手段。直接读就可以。
2.2 有读有写
2个线程写,8个线程读,如果代码没有特别的处理,那程序肯定崩溃;最简单的不崩溃处理,读的时候不能写,写的时候不能读。2个线程不能同时写,8个线程不能同时读;
写的动作分为10小步:由于任务切换,导致各种事情发生(最可能程序崩溃)。
2.3 其他案例
数据共享
3. 共享数据的保护案例代码
假设开发一个网络游戏服务器。两个自己创建的线程。一个线程收集玩家命令(用一个数字表示 ),并把命令数据写到一个队列中。另一个线程,从队列中取出玩家发送来的命令,解析,然后执行玩家需要的动作。
如果有两个线程,一个线程读,一个线程写,最后会出现异常,所有要考虑线程锁的机制。
引入一个C++保护多线程共享数据的第一个概念,“互斥量”
#include <memory> #include <iostream> #include <thread> #include <vector> #include <list> class A { public: void inMsgRecvQueue() { for (int i = 0; i < 10000; ++i) { std::cout << "inMsgRecvQueue() 执行,插入一个元素" << i << std::endl; msgRecvQueue.push_back(i); } } void outMsgRecvQueue() { for (int i = 0; i < 10000; ++i) { if (!msgRecvQueue.empty()) { //消息队列不为空 int commond = msgRecvQueue.front(); msgRecvQueue.pop_front();//移除第一个元素 但不返回 //处理数据 } else { //消息队列为空 std::cout << "outMsgRecvQueue()执行,但目前消息队列为空" << i << std::endl; } } } private: std::list<int> msgRecvQueue; }; int main() { A mobja; std::thread myOutnMsgObj(&A::outMsgRecvQueue, &mobja); std::thread myInMsgObj(&A::inMsgRecvQueue, &mobja); myOutnMsgObj.join(); myInMsgObj.join(); return 0; }
这篇关于2021-10-03 C++多线程编程(5) 创建多个线程、数据共享问题分析、案例代码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-07fastcgi 是什么-icode9专业技术文章分享
- 2024-10-07fastcgi 的详细使用教程介绍-icode9专业技术文章分享
- 2024-10-07git如何更新单个文件到本地-icode9专业技术文章分享
- 2024-10-07如何使用ASM(Abstract Syntax Tree Manipulation)技术来修改第三方AAR依赖中的函数-icode9专业技术文章分享
- 2024-10-07Activity 跳转时间耗时很长怎么优化解决-icode9专业技术文章分享
- 2024-10-07Androud Toast 有哪些常用的第三方组件-icode9专业技术文章分享
- 2024-10-07在viewmodel中怎么使用 mmkv?-icode9专业技术文章分享
- 2024-10-07MMKV.defaultMMKV() 是单例模式吗?-icode9专业技术文章分享
- 2024-10-04el-table 开启定时器下,表格的选中状态会消失是什么原因-icode9专业技术文章分享
- 2024-10-03如何安装和初始化飞牛私有云 fnOS?-icode9专业技术文章分享