C++多线程学习[一]:认识线程,创建线程

0、进程和线程的概念

进程:进程就是运行中的程序。

线程:进程中的进程,简单理解来说就是一个进程由多个线程来执行程序(线程的数量与CPU的核数有关)。在这里插入图片描述

就像上面例子一样视频画面的展示,音频的播放,字幕的显示都是同步进行的(并行),线程负责进程的分工。

如果进程只有一个线程的话(串行),那么对于功能的实现不仅运行效率低,而且代码十分复杂。

1、为什么要多线程

1)任务分解
耗时的操作,任务分解,实时响应
2)数据分解
充分利用多核CPU处理数据	
3)数据流分解
读写分离,解耦合设计	

2、简单创建一个线程

在这里插入图片描述

1)std::thread: 创建一个线程,其中有三个重载,这里是直接将函数传进去,t线程来执行函数的过程。
2)join():起阻塞作用,等子线程退出, 当我们开辟一个线程时,主线程(main函数)并不会在开辟线程的那行代码停下来等线程的内容执行完,而是主线程接着往下执行,所以我们要在后面加一个join()用来等待t线程执行完(要不然主线程都执行完了,而t线程还没执行完就会报错)。

2.1获取线程的ID

在这里插入图片描述

通过this_thread::get_id()的方法就可以得到所在线程的ID ,可以看到两个线程ID号截然不同。

PS:这里连个线程的运行顺序是随机的,我们通过后面加锁的形式来实现线程的同步问题。

在这里插入图片描述

每次运行顺序都不一样。(大家可以自己试试感受一下)

2.2 std::thread源码

3 thread对象生命周期和线程等待、分离。

关于线程的生命周期的一些问题

在程序中,栈中的变量会在{}之后销毁掉,也就是说如果我们的线程在一对{}内,如果出{}后,线程的对象也就会被销毁掉,但是线程依旧在进行。

在这里插入图片描述

那么程序就会出现错误。为了解决这类问题,出现了很多方案。

1)首先第一个也就是等待线程退出

在这里插入图片描述

但是这样的话会阻塞主线程,我们希望的是主线程和子线程同时进行。

2)其次是 detach()函数 (现在一般不用detach了)

这样的话会让我们的子线程与主线程分离,子线程去往后台。 通常我们称为守护线程,这样的话我们的主线程就不会阻塞。但是也会存在问题,主线程退出后,子线程不一定会退出,会造成我们的程序当掉(结束时弹出错误窗口)。

在这里插入图片描述

原因 : 当我们的主线程结束时会释放掉资源,但是我们的子线程仍然在继续运行,可是子线程内部的变量都已经释放掉,但是子线程仍然访问释放掉后的地址资源。

解决此类情况:1)使用detach()的话不要访问外部变量,只访问子线程的内部变量。 2)在主程序要结束时,通知子线程,使其结束掉。

3)现在多数的做法,设置全局变量来判断是否退出。

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ae9378410914e558216254cd8f496bb.png

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain_ZZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值