C++11多线程知识点总结 一、多线程的基本概念 1、进程与线程的区别和联系 进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程; 线程:是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。通俗理解:例如你打开就是打开一个进程,在里面和好友视频聊天就是开启了一条线程。 两者之间的关系:一个进程里面可以有多个线程,至少有一个线程。一个线程一定会在一个进程里面。 推荐视频: 多进程、多线程、线程使用场景分析 全网最详细epoll讲解,6种epoll的设计,让你吊打面试官 学习地址:c/c++ linux服务器开发/后台架构师 2、并发,并行的区别 并发:同一时间段内交替运行多个进程(线程); 并行:同一时刻运行多个进程(线程)。很明显,只有多处理器才能支持。 并发就像我们的大脑思考一样,同一个时刻只能想一件事,但是在很短的一个时间段内我们可以三心二意。当然如果你长了几个脑袋,那你就可以并行思考了。 3、同步与异步,阻塞与非阻塞方式 下面介绍同步,异步,阻塞,非阻塞这几个概念,加深对多线程编程的理解。 有了之前的概念,我们可以想象,当几个线程或者进程在并发执行时,如果我们不加任何干预措施,那么他们的执行顺序是由系统当时的环境来决定的,所以不同时间段不同环境下运行的顺序都会不尽相同,这便是异步(有差异的步骤)。当然,同步肯定就是通过一定的措施,使得几个线程或者进程总是按照一定顺序来执行(总是按照相同的步骤)。 当一个进程或者线程请求某一个资源而不得时,如I/O,便会进入阻塞状态,一直等待。scanf()便是一个很好的例子,当程序运行到scanf()时,如果输入缓存区为空,那么程序便会进入阻塞状态等待我们从键盘输入,这便是以阻塞的方式调用scanf()。通过一定方法,我们可以将scanf()变成非阻塞的方式来执行。如给scanf()设置一个超时时间,如果时间到了还是没有输入那么便跳过scanf(),这个时候我们就称为用非阻塞的方式来调用scanf()。 对比可以发现,同步即阻塞。想要按照某特定顺序来执行一系列过程,在上一个过程完成之前下一个过程必须等待,这就是阻塞在了这个地方。当同步运行的时候,会等待同步操作完成才会返回,否则会一直阻塞在同步操作处。 相反的,异步即非阻塞,当异步调用某个函数时,函数会立刻返回,而不会阻塞在那。 怎么判断异步操作是否已经完成?通常有3种方式: 1. 状态:异步操作完成时会将某个全局变量置为特定值,可以通过轮询判断变量的值以确定是否操作完成; 2. 通知:异步操作完成会给调用者发送特定信号; 3. 回调:异步操作完成时会调用回调函数。 所以同步即阻塞,异步即非阻塞。 4、线程阻塞的常见情况 1. 调用sleep()进入睡眠状态; 2. 用wait()暂停了线程,除非收到notify()唤醒线程; 3. 线程正在等待一些IO操作; 4. 线程正在试图调用被锁起来了的对象。 二、线程的几种状态转换 线程在一定条件下,状态会发生变化。线程一共有以下几种状态: 1. 新建状态(New):新创建了一个线程对象; 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得; 3. 运行状态(Running):就绪状态的线程了CPU,执行程序代码; 4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 5. 死亡状态(dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/50094.html