线程概念
在⼀一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的
控制序列”。
一切进程至少都有一个执行线程。
Linux下线程的特点
Linux的线程是通过进程来模拟的,也就是说Linux里的线程本质上就是进程
进程和线程的区别
进程是资源竞争的基本单位
线程是程序执行的最小单位
线程共享进程数据,但也拥有⾃自⼰己的一部分数据: >* 线程ID >* 一组寄存器 >* 栈 >* errno >* 信号
屏蔽字 >* 调度优先级
线程和进程的关系
POSIX线程库
与线程有关的函数构成了一个完整的序列,要使用这些函数,需要调用pthread头文件,链接这些线程函数库时要使用编译器命令的“-lpthread"选项(直接加到Makefile);
线程的创建
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;失败返回错误码
结果:
LWP:线程ID
NLWP:线程数
线程等待
为什么要线程等待?
已经退出的线程,其空间没有被释放,仍然在进程的地址空间,如果一个线程结束运行但没有被等待,那么它类似于僵尸进程,占用的资源在进程结束前都不会被回收,所以当一个线程运行完成后,我们应该等待回收资源。
int pthread_join(pthread_t thread, void ** retval);
参数
thread:线程IDvalue_ptr:它指向⼀一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
结果
线程终止
如果需要只终止某个线程而不是整个进程都终止,有三种方法。
- 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
- 线程可以调用pthread_exit终止自己。
- 一个线程可以调用pthread_cancel终止同一进程中的另一个进程。
这里只需学习第二个方法:
void pthread_exit(void* value_ptr);
参数
value_ptr:value_ptr不要指向一个局部变量。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)。
结果:
线程分离与结合
无论何时,一个线程是可结合(joinable )的或者是分离(detached)的。
当线程属于可结合时,它能够被其他线程join或者cancel回收资源。相反一个已经处于分离的线程是不能被join或cancel,资源会在终止时自动释放。即线程办完事情后自动回收资源。
创建一个线程,默认是可结合的,为了防止资源的泄露,我们可以显示的调用pthread_join()
回收资源。对一个处于可结合的线程调用pthread_join()
后,可以将线程置于分离状态。不能对同一个线程调用两个join,对一个已经分离的线程调用join会返回错误号。
int pthread_join(pthread_t thread,void** ptr_value);
参数
thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
结果: