1、多线程相关概念
1.1 并发、并行、串行
并发(Concurrent):并发是指两个或多个事件在同一时间间隔内运行。在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。
同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
并行(Parallel):并行是指两个或者多个事件在同一时刻运行。当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。如下图所示。当线程数超过cpu核心数时,部分线程变成了并发执行。

串行:并行和串行指的是任务的执行方式。并行指的是多个任务可以同时执行 。串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个,它们在时间上是不可能发生重叠的。如下图所示:

1.2 同步、异步
阻塞(blocking)、非阻塞(non-blocking):可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了(进程或线程就阻塞在那了,不能做其它事情),否则就可以理解为非阻塞(在等待的过程中可以做其它事情)。
同步(synchronous): 是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
同步是阻塞模式,其相当于单线程中的串行模式
同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。
异步(asynchronous):是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
异步是非阻塞模式,多线程都是异步的
异步就相当于当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率
1.3 进程、线程
进程(Process):是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程。
线程(Thread):是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
进程与线程的区别:
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;进程是系统资源分配的单位,线程是系统调度的单位。
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,进程之间不能共享资源,而一个进程内的线程可以共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
- 调度和切换速度:线程上下文切换(
其包含共享资源)比进程上下文切换(其不包含共享资源)要快得多。
1.4 多线程
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。每个线程都有自己的专有寄存器(如栈指针、程序计数器),但代码区是共享的,即不同的线程可以执行同样的方法。多线程技术允许单个程序创建多个并行执行的线程来完成各自的任务,从而提高整体的处理性能。
多线程是一种机制,允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程与进程相似,但线程更为轻量级,并且专注于执行单一的任务。多线程是多任务的特殊形式,它能够提高系统的效率,特别是在需要同时完成多项任务的情况下。
以上内容参考自 :https://blog.csdn.net/wang121213145/article/details/123828346
2、多线程编程关键知识
2.1 如何创建线程
1. 创建线程的一般方法
说明
- 主线程从main开始执行,一旦主线程从main()返回,则整个程序(进程)结束
- 如果主线程结束了,其他子线程还没执行完,一般会被操作系统强行终止(除非子线程设置为detach)
- 通常我们创建的子线程从一个函数开始运行,一旦此函数运行完毕,代表这个线程运行结束
- 如果想保持子线程一直运行,不要让主线程运行完毕(除非子线程设置为detach)
2.创建子线程的一般方法
- 包含头文件:#include <thread>
- 编写一个子线程开始执行的函数(初始函数)
- 使用thread()创建子线程
- 设置主线程和子线程的关系,join()或detach()
- join() 表示子线程会阻塞主线程的运行,detach()单独运行
2.1.1 thread()
(1)先看一个示例,这里子线程myprint和主线程main并发运行
#include <iostream>
#include <thread>
#include<windows.h>
using namespace std;
//子线程的初始函数
void printThread(int theadId)
{
cout << "我的线程开始执行:" <<theadId<< endl;
Sleep(1000);
cout << "我的线程执行完毕" << endl;
}
//主线程在从main开始执行,一旦主线程从main()返回,则整个程序结束
int main(


9664

被折叠的 条评论
为什么被折叠?



