一、线程创建
- int pthread_create(pthread_ t *tid, pthread_attr t attr, void(*thread routine) (void *arg),void *arg)
1>tid:输出型参数,用于向用户返回线程id,是后续线程操作的句柄
2>attr:用于设置线程属性,通常置NULL
3>thread_routine: 线程的入口函数
4>arg:最终会通过线程入口函数的参数传递给线程的数据
5>返回值:若成功则返回0, 失败返回一个非0值
1、 使用ps -L选项可以查看轻量级进程信息
2、LWP这一项是轻量级进程id,实际上就是pcb中的pid
3、在外边查看到的进程id实际是pcb中tgid-线程组id
线程组id等于进程中主线程的轻量级进程id的值
- tid是什么,如何成为线程的操作句柄?
创建线程,会在进程的虚拟地址空间中开辟一块相对独立的空间作为线程的地址空 间,这个空间内包含用户态对线程的描述,实现对线程的操作,线程栈;创建线程成功之后, 会将这块空间的首地址返回给用户;
用户对线程进行操作,就可以通过首地址找到线程的数据,进行进行一系列的操作,因此返回的线程地址空间的首地址就是线程的操作句柄,也就是pthread_create函 数返回的tid线程的地址空间也是在进程的地址空间之内的一部分
tid:线程空间在虚拟地址空间中的首地址
PID:实际上是线程组id tgid = mainthread-> pcb-> pid
LWP:实际上是每个线程pcb中的pid pcb-> pid
pthread_t pthread_ self() :返回调用线程的线程id
pthread_ create创建一个线程的接口应用
pthread_ self()获取线程id的接口应用
二、线程终止
- 退出一个线程
- 主动退出:线程入口函数中的return (main函数中的return是 用于退出进程的而不是主线 程) ;
void pthread_exit(void *retval); 退出调用线程; retval :返回一个退出返回值;- 被动退出:
int pthread_cancel(pthread_t thread);取消一个线程;
thread: 要取消的线程id- 在主线程中调用pthread_ exit可以退出主线程,但是不会退出进程 只有所有的线程都退出了,进程才会退出
三、线程等待
- 概念:等待一个指定线程的退出;获取这个退出线程的返回值;并且允许系统回收这个线程 占用的资源
- 为什么要进行线程等待-----因为线程有一个属性,默认叫joinable,处于这个属性的线程,退出后不会自动回收资源;需要其它线程进行等待处理;
- 如何等待:
int pthread_ join(pthread_ t tid, void **retval);
1>tid:用于指定要等待的线程
2>retval:输出性参数, 返回线程的退出返回值
四、线程分离
- 线程分离的实现:
等待线程退出,原因是joinable属性的线程资源无法自动被回收;过程等待线程退出,获取返 回值,释放资源在如果不想获取线程的返回值的情况下,能不能直接释放线程资源,不需要再去等待 - 线程分离的概念:
设置线程属性,从joinable设置 为detach,处于detach属性的线程退出后,会自 动释放资源(这种线程不需要被等待)pthread_ join是线程等待–阻塞函数(如果线程没退 出,就一直等待) - 如何分离一个线程:
int pthread detach(pthread_ t tid);分离一个指定的线程 - -设置这个指定线程的属性为 detach
分离一个线程,可以在任意位置,任意线程中完成,