linux线程间的同步与互斥知识点总结

  

在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性。

  

线程同步:条件变量

  

为什么使用条件变量& # 63;

  

,条件满足会通知其他等待操作临界资源的线程,类似信号。场景:T-DAY展会排队参观/生产者消费者模型

  

条件变量是什么& # 63;

  

是一种同步机制,

  

条件变量操作& # 63;

  

<强>初始化和销毁

  

<强> pthread_cond_wait

  

  

  

<强> pthread_cond_signal一对一唤醒

  

唤醒等待队列中的一个线程

  

<强> pthread_cond_broadcast广播唤醒

  

唤醒等待队列中的全部线程

  

为什么等待和解锁需要原子操作/为什么条件变量要使用互斥锁& # 63;

  

因为pthread_cond_wait中的锁是为了保护条件变量,防止错过信号,如果等待解锁不是原子性操作,比如线程一个先解锁,此时CPU时间片切换到线程B线程B加锁并发送条件变量信号,此时再切换到线程,线程一个还来不及等待就错过了信号,就可能会永久阻塞下去,所以,等待和解锁必须是原子性操作。

  

为什么需时要循环判断临界资源是否存在& # 63;

  

在一对多的情况下,生产者发送一个信号,等待的线程被唤醒并加锁,但是只有一个线程能加锁,其他线程就会阻塞等待锁,如果这个线程用完了临界资源,其他线程不进行判断就继续往下走,是不合理的。

  

信号要先解锁还是后解锁& # 63;

  

如果先解锁,锁被没有阻塞等待的线程拿到了,再把临界资源使用了,解锁后的信号就没意义了,也就是虚假唤醒;

  

先信号唤醒,再让唤醒的线程争抢锁,在linux下,有两个队列,一个是cond_wait,一个是mutex_lock,信号只是让cond_wait上的线程转移到mutex_lock,不会返回用户空间,这样能提高效率。

  

<强>线程互斥:互斥锁

  

<强>为什么使用互斥锁& # 63;

  

对临界资源同时间唯一访问,保护临界资源防止修改。场景:黄牛抢票

  

<>强互斥锁是什么& # 63;

  

是一个0/1计数器,1代表有资源能操作,0代表没有资源可以操作。

  

<>强互斥锁操作& # 63;

  

初始化和销毁

  

加锁——如果计数为1,置0,进行需要的操作,如果计数为0,则阻塞等待计数变为1

  

解锁- - -计数置为1

  

以上就是本次介绍的全部相关知识点,感谢大家的学习和对的支持。

linux线程间的同步与互斥知识点总结