多线程

线程控制/线程创建/线程终止/线程等待/线程分离

一、线程控制:

线程控制的接口都是库函数(操作系统并没有向用户提供创建一个轻量级进程的接口,因此大佬们才封装的一套线程控制接口)

二、线程创建:

int pthread_create(pthread_t *tid,pthread_attr_t *attr,void*(*thread_routine)(void* arg),void *arg)

tid:用于获取线程id,通过这个id可以找到线程的描述信息,进而访问pcb(轻量级进程完成调度)
attr:线程属性,通常置NULL
thread_routine:线程入口函数,创建一个线程就是为了运行这个函数,函数运行完毕,则线程退出。
arg:通过线程入口函数,传递给线程的参数
返回值:0—成功,失败返回一个非0值—errno

  1. ps -L :选项的功能是查看轻量级进程信息
  2. pcb->pid:轻量级进程ID-LWP
  3. pcb->tgid:线程组ID,也就是外边命令所看到的进程ID;而这个ID的值等于主线程的pcb->pid
  4. tid:线程在虚拟空间中开辟的线程空间的首地址
    在这里插入图片描述
    在这里插入图片描述

三、线程终止

  1. 普通线程入口函数中的return, (main函数中的return退出的是进程)
  2. void pthread_exit(void *retval); 退出一个线程,谁调用,谁退出, retval-线程返回值
  3. int pthread_cance(pthread_t tid); 退出指定的线程;tid就是指定的线程id

注意:

  1. 线程退出,也不会完全释放资源,需要被其他线程等待
  2. 取消自己是一种违规操作,主线程退出,
  3. 其他线程正常运行,这也不是主流做法
  4. 主线程退出,并不影响整个进程的运行,只有所有的线程退出,进程才会退出;

四、线程等待:

等待一个线程的退出,获取退出线程的返回值,回收这个线程所占的资源

  • pthead_exit(void*retval)
  • int pthread_join(pthread_t tid,void **retval)
  • tid:指定要等待的线程id
  • reval:用于获取线程退出的返回值
  • 不是所有的线程都能被等待,一个线程被创建,默认情况下有一个属性-joinable;处于joinable属性的线程退出后,不会自动释放资源,需要被等待。

五、线程分离:

将线程的属性从joinable设置为detach;处于detach属性的线程退出后会自动释放资源,不需要被等待。

  • int pthread_detach(pthread_t tid); -----分离指定的线程;
  • 等待一个被分离的线程,则pthread_join会返回错误;这不是一个joinable线程(因为在获取返回值的时候将获取不到,detach属性的线程退出后已经自动的释放了资源)
  • 线程的分离可以任意地方,可以在线程入口函数中让线程分离自己,也可以让创建线程在创建之后直接分离(在哪里分离完全取决于个人习惯)

六、线程安全:

在多个执行流中对同一个临界资源进行操作访问,而不会造成数据二义;

  • 如何实现线程安全:同步与互斥
  • 互斥:通过保证同一时间只有一个执行流可以对临界资源进行访问(一个执行流访问期间,其他执行流不能访问),来保证数据访问的安全性
  • 同步:通过一些条件判断来实现多个执行流对临界资源访问的合理性(有资源则访问,没有资源则等着,等有了资源再被唤醒)
  • 如何实现互斥:互斥锁
  • 如何实现同步:条件变量 posix标准的信号量

互斥锁在这里插入图片描述
计数器:0/1 0-不可访问 1-可以访问
计数器初值为1

每一个线程访问临界资源之前,先判断计数,当前临界资源的状态(是否有人正在访问—正在访问的线程状态置位了0—不可访问)

  • 第一个线程访问的时候,判断可以访问,因此将状态置位不可访问,然后去访问资源
  • 其他线程访问的时候,发现不可访问,就陷入等待
  • 第一个线程访问临界资源完毕后,将状态置位1-可以访问,唤醒等待的线程,大家重新开始竞争这个资源
    在这里插入图片描述
 - pthread_mutex_t	互斥锁变量类型
 - pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t
   *attr);	初始化互斥锁
 - pthread_mutex_lock(pthread_mutex_t *mutex);	在临界资源访问之前加锁
 - pthread_mutex_unlock(pthread_mutex_t *mutxe);	     在临界资源访问完毕后解锁
 - pthread_mutex_destroy(pthread_mutex_t *mutex);	销毁互斥锁
 - pthread_mutex_trylock / pthread_mutex_timedlock

同步的实现:保证资源访问的合理性

  • 有资源的时候可以获取,没有资源的时候则需要让线程等待,等待被唤醒(其他线程产生一个资源的时候)

条件变量:向用户提供了两个接口:使一个线程等待的接口和唤醒一个线程的接口+等待队列

  • 条件变量只是提供了等待与唤醒的功能,但是什么时候等待,什么时候唤醒,需要用户自己来做判断
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值