我正在尝试使用共享内存和信号量来实现管道(可能我还需要信号来完成我的实现)
我遇到了如何正确设置信号量的算法问题。
假设我已经为管道缓冲区分配了一块共享内存,并为管道的信息分配了一块共享内存(例如管道中有多少字节等......)
- 我想创建互斥(一次只有一个读取器/写入器使用管道)
- 如果读者想从空管道中阅读,我应该阻止他,直到作家写东西
- 与“2”相同,但写入完整管道的作家
我试图寻找答案,但我没有找到任何答案,尽管这似乎是一个常见的练习......
我知道一个名为“有界缓冲区问题”或“消费者生产者问题”的解决方案,其实现方式如下:
有 3 个信号量: mutex - 初始化为 1 full - 初始化为 0 empty - 初始化为 n (虽然 n 是管道中的“字节”数)
消费者代码:
wait(full)
wait(mutex)
remove a byte from the pipe
signal(mutex)
signal(empty)
生产者代码:
wait(empty)
wait(mutex)
add a byte to the pipe
signal(mutex)
signal(full)
该解决方案中的问题(用作我的问题的解决方案)是在给定时间内,只有一个字节从管道中读取或写入。
在我的问题中 - 实现管道,我不确定作者将写入多少字节。如果他想写'n'个字节,那么他只有在管道中有一个位置时才会写它,如果没有,他会写少于'n'个字节......
这意味着写入者在写入之前必须检查管道中有多少可用空间。这是一个问题 - 因为作者将在没有互斥的情况下触及关键部分(管道的信息)。
所以我想把这部分放在关键部分,但是 - 如果一个作家想写并且管道已经满了 - 我怎么能只让一个读者在里面,然后让作家写更多呢?
我已经糊涂了...
任何帮助将不胜感激,谢谢!