【Linux】线程-线程控制

线程控制

使用线程需要注意的是,需要引入头文件pthread.h,并且在编译的时候,需要使用-lpthread

线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)

thread:返回线程id
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:函数地址,即线程启动时要执行的函数
arg:传递给线程启动函数的参数
返回值:成功返回0,失败返回错误码

需要注意的是:pthread_create函数会产生一个线程ID,存放在第一个参数指向的地址中,而指向的这个地址其实是指向一个虚拟内存单元,这个内存单元的地址就是新创建的线程ID。
传入的thread,它的类型的pthread_t类型,那么这个类型是什么呢?

当前linux实现的标准线程库中,pthread_t的类型本质上是一个进程地址空间的一个首地址。

在这里插入图片描述

线程终止

多个线程的编程而言,如果某个线程异常退出,会导致整个进程的退出,那么如果想要仅让某个线程退出,而不退出整个进程组,有三种方式。

returnpthread_exitpthread_cancel
退出当前线程,主线程除外谁调用谁退出退出当前进程组中其他的线程
void pthread_exit(void* value_ptr);

value_ptr:指向一个在堆上开辟的空间

int pthread_cancel(pthread_t thread);

thread:线程ID
返回值:成功返回0,失败返回错误码

线程等待

线程在CPU看来也是一个PCB,那么当一个线程退出的时候,就需要和进程一样,对其进行资源回收,否则会造成内存泄漏。那么就需要和进程一样,进行线程等待,让其他线程去回收即将要退出的线程。
使用的函数是pthread_join

int pthread_join(pthread_t thread, void** value_ptr)

参数:
thread:线程ID
value_ptr:指向一个指针,指针指向线程的返回值
返回值:成功返回0,失败返回错误码

注意:该函数为阻塞类型的函数,调用这个函数的线程将阻塞等待,直到被等待的线程退出,该函数才会返回。传递的value_ptr需要执行一块堆上的空间,而且在上述不同的线程终止情况下,通过pthread_join得到的终止状态也是不同的。
但是一般来说,由于工作线程的运行时间是非常长的,并且不会让线程执行完某项工作后就退出,而且我们一般不关心线程退出的状态信息,故我们会传递NULL给pthread_join的第二个参数。

分离线程

当我们使用pthread_create函数创建线程后,新创建的线程默认是joinable的,就是说需要程序猿自己写线程回收的代码,用于回收当线程终止后的线程资源。但是这样使用起来也不方便,还容易遗忘,因此当我们不关心线程终止的返回值,就可以让线程自己在终止的时候,让操作系统自动回收线程资源。

分离的方式有两种:自己主动分离自己,其他线程分离当前线程。

int pthread_detach(pthread_t thread);

参数:thread:线程id,可以传递自己的线程id,也就是pthread_self()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值