线程的创建、终止、等待和分离

线程控制:包括线程的创建、终止、等待和分离
一、线程创建
操作系统并没有提供创建线程的系统调用接口,通过库函数创建线程,其实是创建了一个用户态线程,并在内核中创建了一个轻量级进程pcb实现线程的调度

pthread_create函数

功能:创建一个新的线程
原型
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函数创建线程之后会返回一个pthread_t tid,这个tid是指线程局部存储空间的地址,通过tid能够找到线程信息进行操作----这个tid就是操作句柄
线程之中没有父子之分,只有主线程和普通线程之分,调度哪个取决于CPU调度

二、线程终止
三种方法
1.从线程函数return。这种方法对于主线程不适用,从main函数return相当于调用exit
2.线程可以调用pthread_exit终止自己,谁调用谁退出
3.一个线程可以 调用pthread_cancle终止同一进程中的另一个线程

pthread_exit函数

功能:线程终止
原型
void pthread_exit(void *value_ptr);
参数
value_ptr:value_ptr不要指向一个局部变量。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)

注意
1.调用pthread_exit(NULL),在主线程退出,并不会使进程退出,所有线程退出了,进程才会退出
2.从main函数中return或者调用exit接口退出的都是进程,进程退出会导致所有的线程都退出

pthread_cancle函数

功能:取消一个执行中的线程
原型
int pthread_cancel(pthread_t thread);
参数
thread:线程ID
返回值:成功返回0;失败返回错误码

三、线程等待
线程等待的原因
1.joinable状态,已经退出的线程,其空间没有被释放,仍在进程的地址空间内,线程等待是为了回收资源;
2.为了使创建新的线程不会复用刚才退出线程的地址空间

pthread_join 函数

功能:等待线程结束
原型
int pthread_join(pthread_t thread, void **value_ptr);
参数
thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
这是一个阻塞函数,若线程未退出,则一直等待

四、线程分离
线程分离的情况:默认情况下,线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造资源泄露;如果不关心线程的返回值,join是一种负担,所以就可以在线程退出时直接释放资源
原理:将joinable–>detach,detach状态的线程,退出后会自动释放资源,不需要被等待,也不会被等待
函数

分离指定线程:int pthread_detach( pthread_t pthread )
分离自己:pthread_detach( pthread_self( ))
注意:线程等待和线程分离只能选择其一

你可能感兴趣的:(Linux,多线程,linux,操作系统)