多线程的基本概念
在一个程序里的一个执行线路叫做线程。也称为一个进程内部的控制序列。每个线程都代表进程的一个执行流。
线程独有的部分:
栈,寄存器,信号屏蔽器,errno,标识符
线程共享的部分:
虚拟地址空间(代码段,数据段),文件描述符,信号处理方式,工作路径,用户ID,组ID
线程的优点:
- 创建/销毁成本更低
- 线程间调度成本更低
- 线程间通信方式更加灵活(全局变量,函数传参)
- 异常和某些系统调用针对的是整个进程
线程的缺点:
- 性能损失
- 健壮性降低
- 缺乏访问控制
- 编程难度提高
一般情况下对程序安全性、稳定性要求更高的使用多线程,其他的使用多线程(shell/服务器)
线程控制
创建/终止/等待/分离
使用POSIX库
使用时加入头文件#include <pthread.h>
链接时要使用编译命令 “-lpthread”
线程创建
typedef void *(*thread_routine)(void *);
int pthread_create(pthread_t *tid,pthread_attr_t *attr,void *(*thread_routine)(void *),void *arg);
- tid:用于获取线程id,用过这个id可以找到线程的描述信息,进而访问pcb(轻量级进程完成控制)
- attr:线程属性,通常设置为NULL
- thread_toutine:线程入口函数,创建一个线程就是为了运行这个函数,函数运行完毕,则线程退出
- arg:通过线程入口函数,传递给线程参数
- 返回值:0 成功,失败返回一个非零值(errno)
在Linux系统中可以使用 ps -L查看线程信息ps -efL
线程终止
- 普通线程入口函数中的return(main 函数中的return退出的时进程)
- void pthread_exi