互斥锁与条件变量

来源:互联网 发布:linux vi 行号 编辑:程序博客网 时间:2024/05/02 02:26

最近复习汤小丹的《计算机操作系统》(西安电子科技大学出版社,第三版)进程、线程同步章节时,发现一个疑问。

在讲进程同步时,提到了两类方法:信号量机制和管程机制。信号量机制又包括四种:①整型信号量;②记录型信号量;③AND型信号量;④信号量集。如果采用整型信号量或记录型信号量,则在共享多个资源时,可能出现进程死锁的情况,因此才引入了AND型信号量。进程死锁情况如下图:



在讲线程同步和通信时,提到了三类方法:互斥锁、条件变量和信号量。而且提到只用互斥锁mutex会引起死锁,因而引入了条件变量。但是没有想明白,如果只用mutex实现线程互斥,会出现上图所示的线程死锁的情况的话,引入条件变量就能够解决了吗?答案是不能。通过查看《POSIX多线程程序设计》才明白,此处的指的线程死锁的情况,不是上述的共享多个临界资源的场景,而是共享一个临界资源出现死锁的场景。摘录的描述如下:当一个线程互斥的访问共享状态时,它可能发现在其他线程改变状态之前它什么也做不了。状态可能是对的和一致的,即没有破坏变量,但是线程就是对当前状态不感兴趣。例如,一个处理队列的线程发现队列为空时,它只能等待,直到有一个节点被添加进队列中。例如,共享数据由一个互斥量保护。线程必须锁住互斥量来判定队列的当前状态,如判定队列是否为空。线程在等待之前必须释放锁(否则其他线程就不可能插入数据),然后等待队列状态的变化。例如,线程可以通过某种方式阻塞自己,以便插入线程能够找到它的ID并唤醒它。但这里有一个问题,即线程是运行于解锁和阻塞之间。因此解锁和阻塞操作必须是原子性的。


参考:

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3642401

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3642403

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1956753


0 0