现代的操作系统引入多任务的概念,传统上多任务实现是多进程完成的。
支持多任务就涉及到进程的切换,也就意味着进程上下文的切换。
上下文就是运行进程需要的资源,内存缓存pc指针等等。
如果我们进程很多,多进程频繁的切换,每次都做上下文切换还是很耗费资源的。
由于进程虚拟地址空间是私有的,因此进程切换开销比较大。
为了调高系统的性能,Linux引入了轻量级的进程(LWP,light weight process):线程la
线程是一个独立运行的函数,相互通讯比较方便。线程之间是兄弟。
在同一进程中创建线程共享该进程的地址空间,线程和进程参与同一的调度。
进程是资源分配的最小单位
线程是进程调度的最小单位
之前当创建一个进程时候,实际上是创建一个main线程,这个main线程独占地址空间
**************************************************************************/
//资源分配:
/*************************************************************************
| 一个进程多个线程共享资源 | 每个线程私有的资源 |
| 进程中打开的文件描述符 | 可执行的指令 |
| 静态数据(全局变量,静态变量) | PC(程序计数器)和相关寄存器 |
| 当前工作目录 | 栈 |
| 可执行的指令 | 局部变量 |
| 错误号errno |
ps 命令 -L参数显示进程,并尽量显示器lwp线程id和Nlwp线程个数
ps ax -L
posix线程标准,需要使用第三方库libpthread.so (sudo find / -name libpthread.so)
安装posix线程标准的man手册章节
man 3 pthread_create
**************************************************************************/
//函数功能:
/*************************************************************************
#include <pthread.h>
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void * arg),
void *arg);
功能:创建一个线程
参数:
thread 线程id变量取地址
attr 线程的属性,NULL表示默认值
start_routine 线程执行的函数
需要自己定义要给 void *(fun) (void * arg)类型的函数,
然后把函数名传进去,这个函数就是线程执行的内容
arg 传递给线程执行的参数
可以接收任意类型的指针,最终值传递给了线程函数
返回值:
成功 0
失败, errno值
Compile and link with -pthread
gcc 01_pthread_create.c -lpthread
编译时候需要加上链接库
**************************************************************************/
浙公网安备 33010602011771号