1、线程概念:
线程是一个轻量级的进程 light process
每一个线程都属于一个进程
进程是操作系统资源分配的最小单元
线程是CPU任务调度的最小单元
线程是一个任务执行的过程,包括创建、调度、消亡
创建:
线程空间位于进程空间内部
进程:
1.文本段
2.数据段
3.堆区
进程中的每个线程,栈区是独立的,共享进程中的数据区和文本区,堆区。
调度:
宏观并行、微观串行
与进程调度保持一致
线程消亡:
线程执行结束后,需要回收线程空间
2、多进程和多线程的优缺点:
1.执行效率:
多线程执行效率高(并发程度(创建速度快)和任务切换(在一个进程空间内部完成多线程任务切换))
多进程执行效率低
2.通信角度
线程可以共享空间,可以直接通信(多线程间可以使用全局变量通信,因为全局变量为共享空间)
进程空间独立,不能直接通信(通信必须使用:管道、信号、消息队列、共享内存、信号灯等方式)
3.安全性:
多进程安全(一个进程异常结束不影响其余进程执行)
多线程不安全(一个线程异常结束会导致进程结束,其余线程均无法继续执行)
4.内存消耗
3、线程的设计框架 posix
线程实现接口:
系统调用 pthread线程库
fork pthread_create
exit pthread_exit
wait pthread_join
1.pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:
创建一个线程
参数:
thread:存放线程ID空间首地址
attr:线程的属性(默认NULL)
start_routine:线程入口函数地址
arg:给线程函数的参数
返回值:
成功返回0
失败返回非0值
注意:一次pthread_create执行只能创建一个线程。
每个进程至少有一个线程称为主线程。
主进程退出则所有创建的子线程都退出。
主线程必须有子线程同时运行才算多线程程序。
线程id是线程的唯一标识,是CPU维护的一组数字。
pstree 查看系统中多线程的对应关系。
多个子线程可以执行同一回调函数。
ps -eLf 查看线程相关信息Low Weigth Process
ps -eLo pid,ppid,lwp(线程id),stat,comm
2、pthread_t pthread_self(void); unsigned long int; %lu
功能:获取当前线程的线程id
参数:无
返回值:成功 返回当前线程的线程id
失败 -1;
线程的退出:
1: 自行退出 ==》自杀 ==》子线程自己退出
return NULL;
void pthread_exit(void *retval);
功能:子线程自行退出
参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)
返回值:无
2: 强制退出 ==》他杀 ==》被其他线程结束
int pthread_cancel(pthread_t thread);
功能:请求结束一个线程
参数:thread 请求结束一个线程tid
返回值:成功 0
失败 -1;
线程间可以指定被取消。
char * retval ; r
int * retval;
3: int pthread_join(pthread_t thread, void **retval);
功能:通过该函数可以将指定的线程资源回收,该函数具有
阻塞等待功能,如果指定的线程没有结束,则回收线程
会阻塞。
参数:thread 要回收的子线程tid
retval 要回收的子线程返回值/状态。==》ptread_exit(值);
返回值:成功 0
失败 -1;
线程的回收
1、线程的结束机制 ====》不同于进程没有孤儿线程和僵尸线程。
====》主进程结束任意生成的次线程都会结束。(因为共享的进程空间被回收了)。
====》次线程的正常结束不会影响主线程的运行。
子线程的回收策略:
1、如果预估子线程可以有限范围内结束则正常用pthread_join等待回收。
2、如果预估子线程可能休眠或者阻塞则等待一定时间后强制回收。
3、如果子线程已知必须长时间运行则,不再回收其资源。
==============================================================================================
4、线程属性
1)可结合性:能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放;
使用pthread_join()函数回收。线程默认具有可结合性 joinable
//类似于僵尸进程
2)分离属性:不能被其他线程回收和杀死的线程具有分离属性,其存储资源在终止时被系统自动释放。
//类似于孤儿进程
1.线程结束后空间自动被操作系统回收,无需调用回收线程的接口函数
2.线程无法在线程结束实现同步
3.无法回收线程结束状态
设置分离属性,目的线程消亡,自动回收空间。
int pthread_attr_init(pthread_attr_t *attr);
功能,初始化一个attr的变量
参数:attr,需要变量来接受初始值
返回:0 成功,
非0 错误;
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能:把一个线程设置成相应的属性
参数,attr,属性变量,有init函数初始化他。
detachstate:有2个可选值,
PTHREAD_CREATE_JOINABLE:可结合性 0
PTHREAD_CREATE_DETACHED:设置分离属性。 1
pthread_attr_destroy
int pthread_attr_destroy(pthread_attr_t *attr);
功能:
销毁线程属性
第二种设置分离属性方法:
int pthread_detach(pthread_t thread);
功能,设置分离属性
参数,线程id号,填自己的id
线程退出清理函数:成对使用
void pthread_cleanup_push(void (*routine)(void *), void *arg);
功能:注册一个线程清理函数
参数,routine,线程清理函数的入口
arg,清理函数的参数。
返回值,无
void pthread_cleanup_pop(int execute);
功能:调用清理函数
execute,非0 执行清理函数
0 ,不执行清理
返回值,无