创建和等待对个线程
#include "pch.h"
#include<iostream>
#include<thread>
#include <vector>
using namespace std;
void myprint(int num) {
std::cout << "线程开始执行了,线程编号= " << num << std::endl;
//.....
std::cout << "线程执行完毕,线程编号= " << num << std::endl;
return;
}
int main()
{
//创建和等待多个线程
vector<thread> mythread;
// 创建10个线程,线程入口统一使用myprint
for (int i = 0; i < 10; i++) {
mythread.push_back(thread(myprint, i)); //创建10个线程,同事已经开始执行
}
for (auto iter = mythread.begin();iter != mythread.end(); iter++)
{
iter->join(); //等待10个线程都返回
}
std:cout << "hello world!" << std::endl; //整个进程退出
return 0;
}
运行结果
- 多个线程执行顺序是乱的,与操作系统调度机制有关;
- 主线程等待所有子线程运行结束,最后主线程结束,推荐这种join写法,更容易写出稳定程序;
- 把thread对象放入容器里管理,方便对大量线程管理。
数据共享问题分析
只读数据
#include "pch.h"
#include<iostream>
#include<thread>
#include <vector>
using namespace std;
vector<int> g_v = { 1,2,3 };//共享数据,只读
void myprint(int num) {
//std::cout << "线程开始执行了,线程编号= " << num << std::endl;
//.....
//std::cout << "线程执行完毕,线程编号= " << num << std::endl;
std::cout << "id= " << std::this_thread::get_id()<<"的共享数据为"<<g_v[0]<<g_v[1]<<g_v[2] << std::endl;
return;
}
int main()
{
//创建和等待多个线程
vector<thread> mythread;
// 创建10个线程,线程入口统一使用myprint
for (int i = 0; i < 10; i++) {
mythread.push_back(thread(myprint, i)); //创建10个线程,同事已经开始执行
}
for (auto iter = mythread.begin();iter != mythread.end(); iter++)
{
iter->join(); //等待10个线程都返回
}
std::cout << "hello world!" << std::endl; //整个进程退出
return 0;
}
- 只读数据是安全稳定的,不需要特别处理手段,直接读取即可;
有读有写
2个线程写,8个线程读,没有特别处理,程序肯定会崩溃;
最简单的处理:读的时候不能写,写的时候不能读,2个线程不能同时写,8个线程不能同时读。(也就是10个线程每次只有一个在写共享数据,其他线程读写操作等待,)
写分为10小步:由于任务切换,导致各种预料之外的事发生,最严重的是崩溃;