对于线程一:
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信号
条件变量加上互斥锁这样既保证了先后运行次序,有保证了系统运行的稳定性
无论是增加一个互斥锁还是再增加一个信号量,都是为了使一个线程顺利运行完之后,另一个线程再运行。