本文只是针对 POSIX 线程库功能接口与知识点的汇总罗列
库 : /lib64/libpthread.so*
头文件 : pthread.h
线程创建与控制:
1.线程标识符 pthread_t
此类型定义如下
/usr/include/bits/pthreadtypes.h : typedef unsigned long int pthread_t ;
注:线程有两重身份:1).线程身份; 2).子进程身份(各线程也具有 pid)
2.线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
返回值:0 成功
参数:thread 线程 ID 变量地址, attr 线程属性结构地址
start_routine 线程入口函数, arg 线程入口函数的参数列表
3.线程终止退出函数
void pthread_exit(void *retval);
入参为退出状态码保存地址,一般无视传入 NULL
4.线程回收函数
int pthread_join(pthread_t thread, void **retval);
父线程回收子线程时调用,若子线程未退出则挂起等待。
入参为目标线程的 ID 和退出状态,若目标线程被取消,则 PTHREAD_CANCELED 保存在*retval
5.线程分离
int pthread_detach(pthread_t thread);
将子线程分离出去,子线程结束后系统自动回收资源
分离后的子线程不可用 pthread_join 回收(报错返回)
6.线程信号发送
int pthread_kill(pthread_t thread, int sig);
注:线程与进程信号原理一样,但影响范围不同。不可采用进程的信号处理方式对待线程
单一线程收到进程级信号,则影响整个进程
7.线程取消
int pthread_cancel(pthread_t thread);
取消一个线程即终止它,但不是立即结束,而是到下一个取消点到达时
取消点通常位于系统函数中。
人工取消点:void pthread_testcancel(void);
若线程中不存在具有取消点的函数调用,则人工加入取消点函数即可。
8.线程信号屏蔽字
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
此用法与进程信号屏蔽字设置函数 sigprocmask 相似,仅作用范围不同
9.线程 ID 比较函数
int pthread_equal(pthread_t t1, pthread_t t2);
判断两个线程 ID 是否相等
10.获取线程自身 ID
pthread_t pthread_self(void);
返回值为自线程的 ID