From df928c793da0f80774c9a6dade7ba1c2069e22e5 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 13 Mar 2018 11:05:58 +0800 Subject: [PATCH] auto commit --- notes/计算机操作系统.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 2e7f2ab9..89958614 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -297,9 +297,9 @@ void P2() { 需要使用一个互斥量 mutex 来对缓冲区这个临界资源进行互斥访问。 -为了控制生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计,这里需要使用两个信号量:empty 记录空缓冲区的数量,full 记录满缓冲区的数量。其中,empty 信号量是在生产者进程中使用,当 empty 不为 0 时,生产者才可以放入物品;full 信号量是在消费者进行中使用,当 full 信号量不为 0 时,消费者才可以取走物品。 +为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计,这里需要使用两个信号量:empty 记录空缓冲区的数量,full 记录满缓冲区的数量。其中,empty 信号量是在生产者进程中使用,当 empty 不为 0 时,生产者才可以放入物品;full 信号量是在消费者进行中使用,当 full 信号量不为 0 时,消费者才可以取走物品。 -注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty=0,此时生成者睡眠。消费者此时不能进入临界区,因为生产者对缓冲区加锁了,也就无法执行 up(empty) 操作,那么生产者和消费者就会一直等待下去。 +注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,也就无法执行 up(empty) 操作,empty 永久都为 0,那么生产者和消费者就会一直等待下去,造成死锁。 ```c #define N 100