线程概念
进程:有独立的进程地址空间,有独立的PCB。 分配资源的最小单位。
线程:没有独立的进程地址空间,有独立的PCB。 最小执行单位。
ps -Lf 进程ID
---->线程号LWP。CPU最小执行的单位。
线程共享:
- 文件描述符表
- 每种信号的处理方式
- 当前工作目录
- 用户ID组ID
- 内存地址空间(.text .data .bss heap 共享库)
线程独享:
- 线程id
- 内核栈用户栈
- errno变量(虽然他是全局变量)
- 信号屏蔽字
- 调度优先级
线程控制原语
pthread_self
获取线程id,线程id是进程内部识别标志
pthread_t pthread_self(void) //成功,0;不会失败
//pthread_t 在linux下为 unsigned long
pthread_create
创建一个线程
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
//成功,0;失败,错误号
/*
thread:保存为我们分配好是线程id
attr:线程属性,通常传NULL
start_rontine:回调函数,线程主函数,该函数结束则线程结束
arg:线程主函数所用参数
*/
pthread_exit
- return:返回到调用者
- pthread_exit:调用该函数的线程退出
- exit:将进程退出
void pthread_exit(void *retval)
//retval:表示退出的状态
pthread_join
阻塞等待线程退出,回去线程退出状态
- 线程通过return返回,retval所指向的单元存放,线程函数的返回值
- 线程调用pthread_exit,retval所指向的单元存放,pthread_exit的参数
- 线程被别的线程调用pthread_cancel异常终止,retval所指向的单元存放,常数PTHREAD_CANCELED
- 如果不关心线程终止状态,可以传NULL
int phtread_join(pthread_t thread,void **retval) //成功,0;失败,错误号
pthread_detach
分离线程。线程结束后,其退出转态不有其他线程获取,而直接自己自动释放。
int phtread_detach(pthread_t thread); //成功,0;失败,错误号
pthread_cancel
杀死线程。需要有取消点(系统调用进入内核),如果没有可以调用 pthread_testcancel()
自行设置取消点。
int pthread_cancel(pthread_t thread); //成功,0;失败,错误号
进程线程对比
进程 | 线程 |
---|---|
fork() | pthread_create() |
getpid() | pthread_self() |
exit() | pthread_exit() |
wait()/waitpid() | pthread_jion() |
kill() | pthread_cancel() |
pthread_detach() |
线程属性
设置分离属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_create(&tid,&attr,tft,NULL);
pthread_init_destroy(&attr);