面试题答案
一键面试- 实现步骤:
- 定义信号量:
- 通常需要两个信号量,一个用于表示缓冲区中的空闲槽位,命名为
empty
;另一个用于表示缓冲区中的已占用槽位,命名为full
。还可能需要一个互斥信号量mutex
来保护对共享缓冲区的访问。
- 通常需要两个信号量,一个用于表示缓冲区中的空闲槽位,命名为
- 生产者代码:
- 生产者首先等待
empty
信号量,若empty
的值大于0,则将其值减1,意味着占用一个空闲槽位。 - 然后获取
mutex
信号量,以确保对共享缓冲区的安全访问。 - 向共享缓冲区写入数据。
- 释放
mutex
信号量。 - 最后发出
full
信号量,将full
的值加1,表示缓冲区有新的数据可供消费。
- 生产者首先等待
- 消费者代码:
- 消费者首先等待
full
信号量,若full
的值大于0,则将其值减1,意味着占用一个已占用槽位。 - 然后获取
mutex
信号量,以确保对共享缓冲区的安全访问。 - 从共享缓冲区读取数据。
- 释放
mutex
信号量。 - 最后发出
empty
信号量,将empty
的值加1,表示缓冲区有了空闲槽位。
- 消费者首先等待
- 定义信号量:
- 信号量取值及含义:
empty
信号量:- 初始值为共享缓冲区的大小
n
,表示缓冲区中的空闲槽位数量。其值的变化反映了缓冲区中空闲位置的情况,每次生产者向缓冲区写入数据前,empty
的值减1;每次消费者从缓冲区读取数据后,empty
的值加1。
- 初始值为共享缓冲区的大小
full
信号量:- 初始值为0,表示缓冲区中已占用槽位数量。其值的变化反映了缓冲区中数据的情况,每次生产者向缓冲区写入数据后,
full
的值加1;每次消费者从缓冲区读取数据前,full
的值减1。
- 初始值为0,表示缓冲区中已占用槽位数量。其值的变化反映了缓冲区中数据的情况,每次生产者向缓冲区写入数据后,
mutex
信号量:- 初始值为1,它是一个二元信号量(取值为0或1),用于保护共享缓冲区的互斥访问。当一个线程获取
mutex
(值变为0)时,其他线程就不能再获取,直到该线程释放mutex
(值变为1)。
- 初始值为1,它是一个二元信号量(取值为0或1),用于保护共享缓冲区的互斥访问。当一个线程获取