一.概念
线程:一个进程内部的控制序列。或者说在一个程序里的一个执行路线
首先明确一个概念,在Linux下是没有进程的控制块的,使用进程模拟的线程。一个进程中至少有一个线程。所以进程跟线程的数量是一对(一)多的。
线程跟进程的区别
1.进程是资源分配的基本单位,线程是CPU调度的基本单位。
2.创建一个线程要比创建一个进程更加轻量化,所以我们一般也把线程叫做轻量级进程。
3.进程之间是相互独立的,一个进程的异常不会导致另一个进程的异常;而线程由于共享地址空间,访问共同资源,如果一个线程异常,可能会导致所有的线程都异常。
4.进程之间数据各自私有,互不干扰,而线程大部分资源都是共享的,但也有部分资源各自私有,比如线程ID,线程栈,各自的寄存器等等。
5.进程间通信是比较麻烦的,而线程由于共享数据,通信是很容易的。
以下用到的所有的函数的头文件都是#include <pthread.h>
,用到的函数在gcc(g++)编译的时候都要加上 -lpthread
创建线程
要知道,创建线程是比创建进程更轻量化的,创建进程要创建PCB,虚拟地址空间,页表,还要在物理内存上存储存储该进程的数据等等,而在Linux下使用进程模拟的线程,则创建线程只需要创建一个PCB即可,该PCB也指向虚拟地址空间。即线程所用数据就是虚拟地址空间上的数据。我们把创建进程时创建的PCB称为主线程。
线程创建函数:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
thread:输出型参数,返回线程ID
attr:设置线程的属性,一般为NULL即可
start_routine:一个函数指针,即线程所要执行的函数,返回值void*,参数void*
arg:传给start_routine的参数。
返回值:创建成功返回0,创建失败返回错误码。
线程等待
为什么要线程等待?
因为已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。如果不进行线程等待,就会发生类似于僵尸进程的问题。所以必须线程等待。
线程等待函数:
int pthread_join(pth