面试题答案
一键面试生产者 - 消费者问题特点
- 数据共享:生产者和消费者共享一个缓冲区,生产者向缓冲区写入数据,消费者从缓冲区读取数据。
- 同步需求:生产者不能在缓冲区满时继续写入,否则会导致数据丢失;消费者不能在缓冲区空时读取,否则会读到无效数据。
- 并发操作:生产者和消费者可能并发执行,需要协调操作顺序。
读者 - 写者问题特点
- 读写特性:允许多个读者同时读取数据,因为读操作不会修改数据,不会产生数据不一致问题。但只允许一个写者进行写操作,因为写操作会修改数据,多个写者或读写同时进行会导致数据不一致。
- 优先级问题:存在读者优先和写者优先的不同策略。读者优先时,只要有读者在读取,写者就会被阻塞;写者优先时,一旦有写者准备写入,后续读者会被阻塞,直到写者完成操作。
解决生产者 - 消费者问题常用同步机制
- 互斥锁:用于保护共享缓冲区,确保同一时间只有一个进程(生产者或消费者)能访问缓冲区,防止数据竞争。
- 信号量:
- empty 信号量:表示缓冲区中的空闲槽位数量,初始值为缓冲区大小。生产者在向缓冲区写入数据前,需要获取一个 empty 信号量(如果 empty 为 0 则等待),写入后释放一个 full 信号量。
- full 信号量:表示缓冲区中的已占用槽位数量,初始值为 0。消费者在从缓冲区读取数据前,需要获取一个 full 信号量(如果 full 为 0 则等待),读取后释放一个 empty 信号量。
解决读者 - 写者问题常用同步机制
- 互斥锁:
- 用于写操作:保护共享数据,确保同一时间只有一个写者能对数据进行写入操作。写者在写入前获取互斥锁,写入完成后释放。
- 用于读者计数:保护读者计数器(记录当前正在读取的读者数量),防止多个读者同时修改计数器导致数据不一致。读者在修改计数器前获取互斥锁,修改完成后释放。
- 信号量:
- 读信号量:用于控制读者的并发访问。当有读者请求读取时,获取读信号量(如果读信号量为 0 则等待),读取完成后释放读信号量。
- 写信号量:用于控制写者的访问。写者在写入前获取写信号量(如果写信号量为 0 则等待),写入完成后释放写信号量。