线程管理
(1)What(什么是线程管理)
对程序中线程的创建、调度、同步、退出、回收等操作进行有效的控制和协调
(2)Why(为什么要管理线程)
充分利用系统资源,提高程序的并发的性能和稳定性。但如果管理不当,可能会导致死锁、资源泄漏等问题
(3)Which(管理线程有哪些工作)
线程创建、线程调度、线程退出、线程回收、线程退出等操作,详细介绍如下列所述
A.创建
在一个进程中调用线程创建函数,可以得到一子线程,必须给每一个创建出的线程指定一个处理函数、否则线程就无法工作
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*threadFun)(void *),void *arg);
- 参数thread:用于返回新创建线程的标识符
- 参数attr:指定线程的属性,如线程的堆栈大小、优先级等。如果为 NULL,则使用默认属性
- 参数threadFun:函数指针,指向新线程将执行的函数
- 参数arg:传递给新线程执行函数的参数
- 返回值:0表示创建成功,非0表示创建失败
B.退出
指的是由于线程执行完毕而终止,或者由于某些原因提前终止。线程可以在任意位置调用 pthread_exit 来主动终止自己的执行
void pthread_exit(void *retval);
参数retval:指定线程退出时返回的值。这个值可以被其他线程通过 pthread_join 函数获取
C.回收
当一个线程创建了其他线程并希望获取这些子线程的结束信息、释放相关资源或者进行一些后续处理时,就需要进行线程回收
int pthread_join(pthread_t thread, void **retVal);
- 参数thread:将被回收的线程标识符
- 参数retval:用于接收被等待线程通过 pthread_exit 传递的返回值
- 返回值:0表示回收成功;EDEADLK:检测到死锁。EDEADLK:检测到死锁。ESRCH:找不到指定的线程。
D.分离
将线程的执行和回收分开,当一线程被标记为“分离”时,那么它执行完毕后将自动释放它所占用的系统资源,而无需父线程调用pthread_join()等待它接受并回收资源
int pthread_detach(pthread_t thread);
- 参数thread:将要被设置为分离状态的线程标识符(在主线程中调用该函数)
- 返回值:返回值为0表示设置成功;否则表示设置失败
说明:线程分离后,主线程可以执行自己的业务逻辑而不会因为调用pthread_join函数而阻塞
E.其它线程相关的函数
线程取消函数:
在一个线程中杀死另外一个线程
int pthread_cancel(pthread_t thread);
- 参数thread:将要被取消的线程标识符
- 返回值:0表示成功取消;非0表示取消失败
说明:该函数只有在thread线程进行系统调用的时候,才会被真正的“取消”,有一种“含笑半步颠”的意味在里边
线程ID比较函数:
比较两个线程,通过 pthread_equal 可以确定两个标识符是否指向同一个线程
int pthread_equal(pthread_t t1, pthread_t t2);
参数t1和t2:被比较的两个线程标识符
返回值:返回值为0表示不相等;非0正数表示相等