条件变量与互斥锁的结合使用

对于线程一:

1.上锁

2.wait

3.解锁

对于线程二:

1.上锁

2.signal

3.解锁

首先,使用条件变量的原因是:我们希望两个线程是有先后顺序进行的,比如生产和消费。消费这个线程要发生在生产之后

如果没有条件变量,如果线程2先拿到锁,那么线程1就没有办法先执行了

其次,必须加上互斥锁的原因。对于wait_cond函数,它的功能是先解锁释放资源,然后进入信号等待队列。如果线程1只完成了释放资源,时间片用完了,这时线程2拿到这个资源就立即产生发送signal这块。但是线程1还没有进入等待状态。

因为还没有运行到wait这一步,所以这时线程2发送的信号它就接收不到,线程1可能会一直处于挂起状态。

(注意一点:如果线程1已经运行到wait这一步了,那么它会一直处于等待状态,此时运行线程2的时候,释放信号就会被接收,而因为正在运行线程2,时间片的分配还没到线程1,不是说线程1处于阻塞状态就没法接收信号量,它可以接收信号量,从而

从阻塞态转化为就绪态,等到时间片分配到,就转化为运行态)

而如果加上一个互斥锁之后,如果1在时间片用完之后没有进入等待状态,但是因为此时并不释放资源,所以即使到了线程2的执行时间,线程2拿不到锁资源,也不会发生signal信号

条件变量加上互斥锁这样既保证了先后运行次序,有保证了系统运行的稳定性

无论是增加一个互斥锁还是再增加一个信号量,都是为了使一个线程顺利运行完之后,另一个线程再运行。

猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/80751966
今日推荐