Linux 多线程:线程控制

  进程有进程控制,线程自然也有线程控制。线程控制分为:创建、终止、等待、分离。本文对线程控制进行简单介绍。

  在Linux中没有线程的概念,Linux中的线程其实是轻量级进程,所以系统中也就没有提供线程的系统调用接口。但是线程还是得用,因此Linux中想要实现线程相关功能,就要使用库函数。

一、线程创建

 进程有自身的pid,线程自然也有,线程的tid是pthread_t类型的数据。

 创建线程就是为了让线程执行一个函数,但是这个函数格式是有讲究的,必须是一个返回值为void * 类型,参数也是void * 类型的函数。

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

 作用:创建线程,并传递需要让该线程执行的函数。

  • pthread_t *thread(tid):传入一个pthread_t 类型变量的地址获取线程id。(tid)
  • const pthread_attr_t *attr:线程的属性,通常置NULL。
  • void *(*start_routine) (void *):函数地址,也就是线程要执行的处理函数。
  • void *arg:向线程的处理函数传递的参数。

 返回值:成功返回0,失败返回非0。

  因为线程有自己的独有数据,因此创建线程后,系统会给每个线程开辟一块空间存储线程自己独有的数据。而这块空间的地址就是函数中的第一个参数:tid,这块空间就存储了线程的独有数据。独有数据中有线程pcb的pid,通过这个pid就可以找到线程pcd。

线程独有数据

二、线程终止

 终止线程就是退出线程,如下是退出线程的几种办法:

  1. 在线程处理函数中调用return语句:线程的处理函数执行完毕后就会退出。

  2. void pthread_exit(coid * retval):在任意位置调用此函数都会退出调用线程。

    • retval:用来获取线程的退出返回值
  3. int pthread_cancel(pthread_t tid):在任意位置调用此函数,取消指定的线程。(若线程被取消,则线程的返回值是:PTHREAD_CANCELED)

    • tid:要取消的线程的tid。

三、线程等待

 线程和进程相似,退出后默认不会自动释放资源。因此线程退出后,需要其他线程进行等待处理,获取退出线程的返回值,然后释放所有资源。

int pthread_join(pthread_t tid,void ** retval)

 作用:等待指定进程退出后释放资源

  • tid:要等待的线程tid
  • void**retval:用于获取线程退出返回值

 返回值:成功返回0,失败返回非0

四、线程分离

 线程退出后不会主动释放所有资源,需要其他线程处理。如果我们需要得到这个线程的返回值,那么我们就必须让另一个线程等待这个线程退出并获取返回值,然后释放此线程的资源,不然资源就会泄露。

 但是有时我们并不需要线程的返回值,只想让它干完活就识相点,把自己处理干净了。因此这时候用到了线程的分离属性。

 分离属性有两个状态:

  • joinable:处于此状态的线程退出后不会自动释放资源,需要进行等待。
  • detach:处于此状态的线程退出后会自动释放资源,不需要被等待,也不能被等待。

分离属性默认是joinable状态,如果要分离线程需要手动设置detach状态。

int pthread_detach(pthread_t tid)

 作用:分离指定线程

  • tid:要分离的线程tid

  因此如果创建一个线程后,不想等待线程的退出,也不需要获取它的返回值,那么就可以把这个线程的属性设置为detach,让他退出线程后自动释放资源。

猜你喜欢

转载自blog.csdn.net/weixin_57761086/article/details/128788418