线程

线程概念

在⼀一个程序里的一个执行路线就叫做线程(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:线程ID
value_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;失败返回错误码


结果








  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值