创建多个线程及数据共享问题

创建和等待对个线程

#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;
}

运行结果
在这里插入图片描述

  1. 多个线程执行顺序是乱的,与操作系统调度机制有关;
  2. 主线程等待所有子线程运行结束,最后主线程结束,推荐这种join写法,更容易写出稳定程序;
  3. 把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;
}

在这里插入图片描述

  1. 只读数据是安全稳定的,不需要特别处理手段,直接读取即可;

有读有写

2个线程写,8个线程读,没有特别处理,程序肯定会崩溃;
最简单的处理:读的时候不能写,写的时候不能读,2个线程不能同时写,8个线程不能同时读。(也就是10个线程每次只有一个在写共享数据,其他线程读写操作等待,)
写分为10小步:由于任务切换,导致各种预料之外的事发生,最严重的是崩溃;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值