正确答案:
-
问题类型:
经典生产者 - 消费者问题 同时涉及同步和互斥。- 同步:生产者与消费者通过信号量协调生产 / 消费节奏(如缓冲区满时生产者等待,空时消费者等待)。
- 互斥:对共享缓冲区的访问需互斥(避免数据冲突)。
-
程序补充:
-
信号量初值:
buffer = n
(缓冲区空闲位置数,初值为缓冲区大小);
product = 0
(缓冲区产品数,初值为 0);
mutex = 1
(互斥锁,初值为 1)。 -
生产者代码:
while(true){ 生产一产品; wait(buffer); // (1) 等待缓冲区有空闲(可放入产品) wait(mutex); // (2) 申请缓冲区访问权(互斥) 往Buffer[in]放产品; in = (in+1)%n; signal(mutex); // 释放缓冲区访问权 signal(product); // (3) 通知消费者有产品 }
-
消费者代码:
while(true){ wait(product); // (4) 等待缓冲区有产品(可消费) wait(mutex); // (5) 申请缓冲区访问权(互斥) 从Buffer[out]取产品; out = (out+1)%n; signal(mutex); // 释放缓冲区访问权 signal(buffer); // (6) 通知生产者有空闲位置 消费一产品; }
-
解析:
-
同步机制:
- 生产者通过
wait(buffer)
确保缓冲区未满(有空闲位置时才生产),生产后用signal(product)
告知消费者 “有产品可消费”。 - 消费者通过
wait(product)
确保缓冲区非空(有产品时才消费),消费后用signal(buffer)
告知生产者 “有空闲位置可生产”。
- 生产者通过
-
互斥机制:
mutex
信号量保证同一时刻只有一个进程(生产者或消费者)访问缓冲区(放入 / 取出产品),避免数据竞争(如生产者写入时消费者同时读取导致数据混乱)。
-
信号量逻辑验证:
- 初始时,
buffer = n
(全空,生产者可连续生产n
次,每次wait(buffer)
消耗 1,signal(buffer)
增加 1)。 product = 0
(无产品,消费者需等待,直到生产者signal(product)
后才开始消费)。mutex = 1
(首次访问缓冲区时,wait(mutex)
使信号量为 0,后续进程需等待,确保互斥)。
- 初始时,