线程控制
- 线程控制
- 线程创建
- 线程终止
- 线程等待
- 分离线程
线程控制
使用线程需要注意的是,需要引入头文件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的类型本质上是一个进程地址空间的一个首地址。
线程终止
多个线程的编程而言,如果某个线程异常退出,会导致整个进程的退出,那么如果想要仅让某个线程退出,而不退出整个进程组,有三种方式。
return | pthread_exit | pthread_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()