#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!!!
2.1 只读的数据
只读数据是安全稳定的,不需要什么特别的处理手段。直接读就可以。
2.2 有读有写
2个线程写,8个线程读,如果代码没有特别的处理,那程序肯定崩溃;最简单的不崩溃处理,读的时候不能写,写的时候不能读。2个线程不能同时写,8个线程不能同时读;
写的动作分为10小步:由于任务切换,导致各种事情发生(最可能程序崩溃)。
2.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; }