管程(Moniter): 并发编程的基本心法( 三 )

enq 和 deq  。 当然前提是 enqdeq 保证互斥性 , 只允许一个线程进入管程 。 是不是很有面向对象的感觉 。

在管程模型里 , 共享变量和对共享变量的操作是被封装起来的 , 图中最外层的框就代表封装的意思 。 框的上面只有一个入口 , 并且在入口旁边还有一个入口等待队列 。 当多个线程同时试图进入管程内部时 , 只允许一个线程进入 , 其他线程则在入口等待队列中等待 。 这个过程类似就医流程的分诊 , 只允许一个患者就诊 , 其他患者都在门口等待 。

管程里还引入了条件变量的概念 , 而且每个条件变量都对应有一个等待队列 , 如下图 , 条件变量 A 和条件变量 B 分别都有自己的等待队列 。

通过条件通知去唤醒等待队列的线程竞争 锁资源 。

我们通过一段代码说明 , 实现一个阻塞队列 , 队列分别有出队与入队 , 都是要先获取互斥锁 , 就像管程中的入口 。

推荐阅读