Linux——多线程的初识

作者 :小 琛
欢迎转载,请标明出处

多线程的意义

我们编写的程序,一个程序执行起来,就不单单只有main()函数一个执行流,而是进程中有多个执行流,这些执行流在运行的时候,可以在同一时间拿着不同的cpu进行运算(执行代码),即一个并行的状态运行。因此程序的执行效率就得以大大提升

例如:我们执行一个从算法,将int arr[1000]这个数组中的每个元素都相加。

常规思路就是arr[0]+arr[1]+arr[2]+arr[3]…arr[999],那么多线程编程就是将arr[1000]分成若干组,例如分为两组。第一组执行arr[0]+arr[1]+…arr[]499],另一组执行arr[500]+arr[501]…arr[999],而这两组是并行的(同一时间进行),那么我的运算效率就会直线提升,这就是多线程编程的逻辑
在这里插入图片描述

从内核解析多线程

对比子线程和子进程

1、创建子进程
fork():在内核中以父进程的PCB为模板拷贝创建一个新的PCB,该PCB被内核使用双向链表管理
2、创建子线程
pthread_creat():在内核中创建一个PCB,PCB指向父进程的虚拟地址空间,内核创建出来的线程,在虚拟地址空间当中的共享区开辟一块内存,保存该线程独有的东西
3、pid和tgid
我们所说的在PCB中的变量pid就是线程id,而对于进程来说,其进程号保存在tgid中。
pid(process ID):轻量级ID,线程ID
tgid(thread group ID):线程组ID,进程ID

举例理解:
现在有一个生成口罩的工厂,该工厂就是一个进程。工厂内有若干条生产线且可以同时进行工作。即该进程有多个线程可以同时进行运算,每一条生产线就是一个线程,则工厂的生产量就是若干条生产线的和。该工厂的每一条生产线都有独特的名字即各自的pid,该工厂的总名字就是tgid,当该工厂只有一条生产线的时候,tgid=pid
在这里插入图片描述
4、多线程和多进程的区分
多进程:每一个进程都有自己独立的虚拟地址空间,多进程的特定独立性也是这个原因。一个进程的崩溃并不会影响另一个进程,多进程也可以提高效率,但是会带来通信的问题
多线程:每一个线程(执行流)共用一个虚拟地址空间,因此一个线程的异常就会导致整个程序的退出

在这里插入图片描述

发布了63 篇原创文章 · 获赞 11 · 访问量 2216

猜你喜欢

转载自blog.csdn.net/qq_44745063/article/details/105368014