第1篇 Linux多线程

  • 时间:2020-04-24 15:13 作者:铁甲万能狗 来源: 阅读:109
  • 扫一扫,手机访问
摘要:进程在了解线程之前,首先需要理解UNIX/Linux进程。 进程是由操作系统创立的,需要相当数量的“开销”。 进程包含有关程序资源和程序执行状态的信息,包括:它是一个在随机访问内存(RAM)中,正在执行的程序,它是资源分配的最小单位。1)进程ID,进程组ID,客户ID和组ID2)环境3)工作目录4)

进程

在了解线程之前,首先需要理解UNIX/Linux进程。 进程是由操作系统创立的,需要相当数量的“开销”。 进程包含有关程序资源和程序执行状态的信息,包括:它是一个在随机访问内存(RAM)中,正在执行的程序,它是资源分配的最小单位。

  • 1)进程ID,进程组ID,客户ID和组ID
  • 2)环境
  • 3)工作目录
  • 4)程序说明
  • 5)寄存器
  • 6)栈
  • 7)堆
  • 8)文件形容符
  • 9)信号动作
  • 10)共享库
  • 11)进程间通信工具(例如消息队列,管道,信号量或者共享内存)
process.gif

线程

它是程序执行的最小单位,又称为轻量级的进程,操作系统独立调度和分派到CPU的基本单位,它是进程中的一个实体,一个进程中可以包含多个线程。这些线程共享同一个进程中的资源,我们之前以进程为单位的编程模式,也叫单线程的编程模式

ss1.png

  • 存在于流程中并使用流程资源
  • 只需其父进程存在并且操作系统支持它,便拥有自己的独立控制流
  • 仅复制需要独立计划的必要资源
  • 可以与平等(独立)运行的其余线程共享进程资源
  • 假如父进程死亡-或者相似的事物死亡
  • 是“轻量级的”,由于大多数开销已经通过创立其过程来完成。

并发:在同一个核心的CPU中,同一个时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具备多个进程同时执行的效果。

ss17.png

并行:是指在同一个时刻,有多条指令在多个解决器上同时执行。

同步:彼此有依赖关系的调用不应“同时发生”,而同步就是阻止同时发生的事情

异步:和同步的概念是相对的,任何两个彼此独立的操作是异步的,它表明事件是独立发生的。
https://www.youtube.com/watch?v=ITCB3mNkGk0&list=PLljKjXpjNpgdgqsD0oHnWZeup3qLrudf4&index=3

创立一个线程

首先每个线程,操作系统都会给每个线程分配一个线程ID,在Linux下,进程ID是一个pid_t类型的整数,线程ID是一个标识符类型pthread_t的整数


ss18.png

像pthread_self()和getpid()这些函数在安装Linux/Unix系统后原生内置的函数,通常叫系统调用(Syscall),就是系统原生提供给C/C++程序员使用的系统函数接口,这些系统函数通常可以通过man命令能够查到它的使用方法,例如可以在/usr/include目录下查看对应的系统函数的头文件

vim /usr/include/bits/pthreadtypes.h

我们知道,线程ID其实就是一个long int的无符号整数


ss18.png

我们也可以通过man getpid和man pthread_self分别查看一下,在使用它们之前需要导入那些依赖的头文件,假如你不熟习的系统函数,你应该经常通过man指令来查看对应的形容文档。


2019-12-31 09-41-51屏幕截图.png

编程示例

我们在没有提及多线程编程模式的时,那些编写的示例代码都是单线程的程序,也就是一个进程中只有一个线程。我们下面的例子是要获取当前运行进程的ID和线程ID,该示例就是一个单线程的程序。

#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>int main(void){  pid_t pid=getpid();  pthread_t tid=pthread_self();      printf("当前线程ID:%lx,进程ID:%u\n",tid,pid);  return 0;}

在编译多线程的程序时,记得链接pthread库,即

gcc app.c -o app -pthread

输出

当前线程ID:7fedbcb524c0,进程ID:30167

小结:

进程是获取资源的最小单位,例如组成我们进程的函数栈和堆内存,注意在主流系统中每个进程中有它对应的函数栈和堆内存,而且这些堆和栈对用于它们的进程来说是私有的,其余进程无法访问。

线程是进程中的一个或者多个实例,而线程的职责是消耗进程取得的系统资源(CPU中的寄存器,计算单元和控制单元,以及随机访问内存),在一个进程中,只有一个线程的程序,该线程也叫主线程,主线程可以创立其余子线程。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】极客时间-数据分析实战45讲【完结】(2021-09-02 16:26)
【系统环境|windows】字节跳动前台面试题解析:盛最多水的容器(2021-03-20 21:27)
【系统环境|windows】DevOps敏捷60问,肯定有你想理解的问题(2021-03-20 21:27)
【系统环境|windows】字节跳动最爱考的前台面试题:JavaScript 基础(2021-03-20 21:27)
【系统环境|windows】JavaScript 的 switch 条件语句(2021-03-20 21:27)
【系统环境|windows】解决 XML 数据应用实践(2021-03-20 21:26)
【系统环境|windows】20个编写现代CSS代码的建议(2021-03-20 21:26)
【系统环境|windows】《vue 3.0探险记》- 运行报错:Error:To install them, you can run: npm install --save core-js/modules/es.arra...(2021-03-20 21:24)
【系统环境|windows】浅谈前台可视化编辑器的实现(2021-03-20 21:24)
【系统环境|windows】产品经理入门迁移学习指南(2021-03-20 21:23)
血鸟云
手机二维码手机访问领取大礼包
返回顶部