文章目录
一,创建多个线程
前面学习了怎么使用thread类创建一个线程C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解
,在实际应用中,我们可以创建多个线程
void TextThread()
{
cout << "我是线程" << this_thread::get_id() << endl;
/* … */
cout << "线程" << this_thread::get_id() << "执行结束" << endl;
}
//main函数里 vector threadagg;
for (int i = 0; i < 10; ++i)
{
threadagg.push_back(thread(TextThread));
}
for (int i = 0; i < 10; ++i)
{
threadagg[i].join();
}
1)把thread对象放入到容器中管理,看起来像个thread对象数组,对一次创建大量的线程并对大量线程进行管理有好处
2)多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关
2,多个线程之间数据共享的问题
创建以后,这多个线程之间是并发运行的,而这多个线程之间可能访问同一个数据。如果这多个线程对该共享数据都只进行读操作,一定不会发生问题,但是如果有一些线程写共享数据,而另一些线程读共享数据;就很容易发生问题。很可能发生某个进程正在写数据还没写完,线程就切换到另一个要对该共享数据读的线程。程序马上奔溃。例如下面将要演示的一个场景,该场景模拟一个简单的游戏服务器,该服务器中有两个线程,一个线程负责往一个共享队列写玩家命令数据;另一个线程负责从这个共享队列中读取玩家命令并执行。读者可以尝试运行下面命令观察这个现象加深理解。该程序中途一定奔溃。
#include <iostream>
#include <thread>
#include <list>
#include <vector>
using namespace std;
class A {
public:
// 把收到的消息(玩家命令)放入到一个队列
void inMsgRecvQueue() {
for (int i = 0; i < 100000; ++i) {
cout << "inMsgRecvQueue()执行、插入一个元素" << i << endl;
msgRecvQueue.push_back(i);
}
}
// 把数据从消息队列中取出的线程
void outMsgRecvQueue() {