线程概述
现代Linux系统主要使用的线程库是NPTL,在Linux中可以通过
getconf GNU_LIBPTHREAD_VERSION
获取Linux线程库版本。谈到线程,就不得不提及线程模型
线程模型
本小节概念较多,采用问答式进行讲解,以帮助读者理解
什么是线程?
线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为内核线程和用户线程。
内核线程和用户线程的区别和联系?
内核线程运行在内核空间,由内核来调度。用户线程运行在用户空间,由线程库来调度。
当一个内核线程获得CPU的使用权时,它就会加载并运行一个用户线程,所以从某种角度上来说,内核线程可以看作用户线程运行的“容器”。
线程与进程的关系?
一个进程可以拥有多个线程,假设该进程的线程分为M个内核线程和N个用户线程,那么这些线程符合以下规律:
- M <= N
- 在一个系统的所有进程中,MN的比值固定
而且根据MN的比值(M:N),可以划分出三种线程模型,其分别是:
- 完全在用户空间实现
- 完全由内核调度
双层调度
三种线程模型?
- 完全在用户空间实现:完全在用户空间实现的线程无需内核支持,内核也不知道这些用户空间的线程存在。由线程库负责所有线程的优先级,时间片调度。对于内核来说仍把整个进程当作最小单位来调度,不区分里面具体的线程。
- 优点:创建和调度线程无需内核干预,不占据内核资源,速度快缺点:对于多处理器系统,一个进程的多个线程无法运行在不同的CPU上
- 完全由内核调度:完全由内核调度的模式将创建,调度的任务全部交给了内核,内核空间的线程库无具体任务。
- 优缺点:与完全在用户空间实现的优缺点正好相反
- 双层调度:前两种实现模式的混合体,结合了前两种模式的优点,不会消耗太多的内核资源,切换线程速度较快,可以充分利用多处理器优势
创建线程和结束线程
现在我们来学习线程管理的API,Linux中他们都定义在phtread.h头文件中
pthread_create
#include<pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t* attr, void*(*start_routinue)(void*), void* arg);
- 作用:创建一个线程
- 参数
- thread:线程标识符
- attr:设置新线程的属性
- start_routine:指定线程运行的函数
- arg:指定线程运行的函数的参数
- 返回值
- 成功:0
- 失败:错误码