进程有进程控制,线程自然也有线程控制。线程控制分为:创建、终止、等待、分离。本文对线程控制进行简单介绍。
在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。
二、线程终止
终止线程就是退出线程,如下是退出线程的几种办法:
-
在线程处理函数中调用return语句:线程的处理函数执行完毕后就会退出。
-
void pthread_exit(coid * retval):在任意位置调用此函数都会退出调用线程。
- retval:用来获取线程的退出返回值
-
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,让他退出线程后自动释放资源。