linux系统编程:Linux系统编程多线程基础

网络编程 2024-03-04 08:45www.168986.cn编程入门
进程
在理解线程之前,需要了解UNIX/Linux进程。 进程是由操作系统创建的,需要相当数量的“开销”。 进程包含有关程序资源和程序执行状态的信息,包括它是一个在随机访问内存(RAM)中,正在执行的程序,它是资源分配的最小单位。
 
1)进程ID,进程组ID,用户ID和组ID
2)环境
3)工作目录
4)程序说明
5)寄存器
6)栈
7)堆
8)文件描述符
9)信号动作
10)共享库
11)进程间通信工具(例如消息队列,管道,信号量或共享内存)
动图封面
线程
它是程序执行的最小单位,又称为轻量级的进程,操作系统独立调度和分派到CPU的基本单位,它是进程中的一个实体,一个进程中可以包含多个线程。这些线程共享同一个进程中的资源,我们之前以进程为单位的编程模式,也叫单线程的编程模式
 
 
存在于进程中并使用进程资源
只要其父进程存在并且操作系统支持它,便拥有自己的独立控制流
仅复制需要独立计划的必要资源
可以与相对地"平等"运行的其他线程共享进程资源
如果父进程死亡-所有线程就不复存在
是“轻量级的”,因为大多数开销已经通过创建其进程来完成。
并发:在同一个核心的CPU中,同一个时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程执行的效果。
 
 
并行:是指在同一个时刻,有多条指令在多个处理器上执行。
 
同步:彼此有依赖关系的调用不应“发生”,而同步就是阻止发生的事情,同步机制通常是一个线程拥有可以访问系统资源的锁,意味着某个线程在某一时刻执行时占用着CPU资源和进程级别的共享对象会被"锁定",其他线程会被抑制执行而无法获取CPU资源和进程级别共享对象访问的控制权,只有等到拥有该锁的线程的锁释放后,其他线程有机会"争夺"获得该锁才能获得CPU资源和进程的共享对象访问的控制权。
 
异步:和同步的概念是相对的,任何两个彼此独立的操作是异步的,它表明事件是独立发生的。
 
创建一个线程
每个线程,操作系统都会给每个线程分配一个线程ID,在Linux下,进程ID是一个pid_t类型的整数,线程ID是一个标识符类型pthread_t的整数
 
 
像pthread_self()和getpid()这些函数在安装Linux/Unix系统后原生内置的函数,通常叫系统调用(Syscall),就是系统原生提供给C/C++程序员使用的系统函数接口,这些系统函数通常可以通过man命令能够查到它的使用方法,例如可以在/usr/include目录下查看对应的系统函数的头文件
 
vim /usr/include/bits/pthreadtypes.h
我们知道,线程ID其实就是一个long int的无符号整数
 
 
我们也可以通过man getpid和man pthread_self分别查看一下,在使用它们之前需要导入那些依赖的头文件,如果你不熟悉的系统函数,你应该经常通过man指令来查看对应的描述文档。
 
 
编程示例
我们在没有提及多线程编程模式的时,那些编写的示例代码都是单线程的程序,也就是一个进程中只有一个线程。我们下面的例子是要获取当前运行进程的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库,即
 
g app.c -o app -pthread
输出
 
当前线程ID:7fedbcb524c0,进程ID:30167
小结:
进程是获取资源的最小单位,例如组成我们进程的函数栈和堆内存,注意在主流系统中每个进程中有它对应的函数栈和堆内存,而且这些堆和栈对用于它们的进程来说是私有的,其他进程无法访问。
 
线程是进程中的一个或多个实例,而线程的职责是消耗进程获得的系统资源(CPU中的寄存器,计算单元和控制单元,以及随机访问内存),在一个进程中,只有一个线程的程序,该线程也叫主线程,主线程可以创建其他子线程

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by