线程控制
注意:操作系统不会单独向上创建线程调用接口,只能通过封装库函数完成对线程操作
区分线程和轻量级进程:线程是基于上层(用户态)而言,对应底层(内核态)就是一个轻量级pcb(lwp)
创建:
int pthead_create(pthread_t *tid , pthread_arr_t *attr , void* (*routine)(void*) , void* arg)
- pthread_t *tid 接受线程tid 线程操作句柄
- pthread_arr_t *attr 设置线程属性(通常置NULL)
- void* (*routine)(void*) 线程入口函数
- void* arg 传递给线程数据
- 返回值:成功返回0 失败返回非0(错误编号)
测试代码如下:
测试结果如下:
退出
在线程入口函数return 线程入口函数运行结束,线程就会被销毁
注意:main函数中return会退出进程,main函数中return后所有线程都结束退出
void pthread_exit(void* retval) 功能:退出调用线程 谁调用 谁退出
int pthread_cancel(pthread_t tid) 功能:取消指定线程
测试结果表明:main函数中使用pthread_cancel(tid) 功能:取消刚创建的线程
测试结果表明:mian函数直接退出 导致所有线程都退出
测试结果表明:主线程退出,并不会引起进程的退出
等待
等待指定的线程退出,获取退出线程返回值,回收资源
一个资源被创建后,默认的情况下,退出时不会自动释放资源
joinable状态,处于这个状态线程退出后不会自动释放资源
int pthread_join(pthread_t tid ,void** retval)
tid:指定要等待的线程
retval:用于获取线程返回值
在获取线程返回值这块需要注意,线程返回值为void*,此处join需要传入void**的参数,如果直接传void**的值,即传入NULL值,导致程序崩溃,对此,只能设置void* retval=NULL,传入&retval 即等同于void**
分离
将线程分离属性设置为detach状态
detach状态,线程退出后,自动释放资源,不需要被等待
int pthread_detach(pthread_t tid )