文章目录
一、线程函数(NPTL API)
线程创建
int err = pthread create(pthread_t* tid , pthread attr_t* attr, void * (*twk)(void *), void * arg) 线程创建函数,成功退回0 ,失败返回错误号。
tid = 线程创建成功, 将此线程的id,传出到变量中
attr = 线程属性参数, 传NULL,表示使用默认属性
twk = 线程工作地址, 此参数为函数指针
arg = 线程函数参数,系统创建线程后调用twk而后把arg传入twk中
线程数量计算 = 进程用户空间余量 / 线程栈大小 = 线程数量
线程回收
pthread_join(pthread_t tid,void ** reval); 线程回收,接收线程返回值 如果不会收会引发线程 (TCB)残留
阻塞函数, 线程未退出等待,退出后立即回收
线程退出
pthread exit((void *)9); 线程退出并返回特定值
线程取消
pthread_cancel(pthread_t tid); //线程取消, 参数未目标篇的tid,可以将目标线程杀死
哪怕进程中没有异常, 不调用系统函数。但是进程使用时间片,要时间片耗尽产生中断就会处理信号,信号肯定能杀死进程
如果线程被取消, 那么回收到的返回值为-1,线程开发时不允许使用-1作为返回值,保留给cancel
Linux命令
ps -eLf #可以查看系统中所有线程
ps -Lf pid #查看特定进程中的线程
只要使用NPTL库函数,都要在编译使用链接库 -lpthread
特点
打印线程id习惯用16进行形态
主线程创建成功后传出tid,与普通线程内部获取的tid 值相等, 但是不等价
线程内部id可以保证线程当前有效性, 但是其他线程中的tid无法保证
二、线程退出状态
默认回收态
回收态线程默认状态, 线程结束后需要手动回收(pthread_join)
可设置成分离态
这类分离态线程,结束后系统自动回收它的资源
pthrerad detach0 此函数可以将线程设置为分离态
线程只能有一种退出状态,两种状态互斥
分离设置不可逆转,无法变为回收态,只能从回收设置为分离
对一个分离态进行回收操作(join) 回收操作失败
如果线程处于回收阶段 (某个线程再等待回收它),那么对线程设置分离不会成功
要想得到线程的返回值来判断线程的退出原因,就用回收态。
线程很多且不需要返回值,就用分离态
三、线程退出方式
return 0;
主线程执行,进程退出,线程关闭
pthread_exit();
无论是主线程还是普通线程执行,均为线程退出,不影响进程
pthread_cancel()
取消目标线程,与进程无关
exit():
无论主线程还是普通线程执行,进程退出,所有线程关闭,释放资源
总结
这就是我大概的理解,线程与进程都是很重要的知识点!