互斥锁与条件变量
2014-02-11 14:12
225 查看
最近复习汤小丹的《计算机操作系统》(西安电子科技大学出版社,第三版)进程、线程同步章节时,发现一个疑问。
在讲进程同步时,提到了两类方法:信号量机制和管程机制。信号量机制又包括四种:①整型信号量;②记录型信号量;③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
在讲进程同步时,提到了两类方法:信号量机制和管程机制。信号量机制又包括四种:①整型信号量;②记录型信号量;③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
相关文章推荐
- 关于条件变量和互斥锁为何配合使用的思考
- 互斥锁和条件变量
- Linux多线程 互斥锁与条件变量使用
- 互斥锁与条件变量及生产者-消费者问题
- 线程同步:何时互斥锁不够,还需要条件变量?
- 生产者--消费者模型之互斥锁和条件变量
- 线程同步:何时互斥锁不够,还需要条件变量?
- 线程同步:何时互斥锁不够,还需要条件变量?
- "互斥锁用于上锁,条件变量则用于等待"
- 嵌入式 Linux C 多线程编程 互斥锁与条件变量
- 互斥锁与条件变量配合使用
- 再谈互斥锁与条件变量!
- UNPv2第七章:互斥锁与条件变量
- 线程、互斥锁与条件变量实例理解
- 【转】再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- 嵌入式 互斥锁和条件变量基础常识
- 互斥锁和条件变量
- Linux C 多线程编程 互斥锁与条件变量
- 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- Linux C 多线程编程之互斥锁与条件变量