[英]Implementing pipe using shared memory & semaphores
我正在尝试使用共享内存和信号量来实现管道(可能还需要信号以完成实现)
我遇到了如何正确设置信号量的算法问题。
可以说我已经为管道缓冲区分配了一块共享内存,并为管道信息分配了一块共享内存(例如管道中有多少字节,等等。)
我试图寻找答案,但即使看起来很普通,也没有找到答案。
我知道一种称为“边界缓冲区问题”或“消费者生产者问题”的解决方案,其实现方式如下:
共有3种信号量:互斥锁-初始化为1满-初始化为0空-初始化为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'个字节。
这意味着编写者必须在写入管道之前检查管道中有多少可用空间。 这是一个问题-因为编写者将在不相互排斥的情况下接触关键部分(管道的信息)。
因此,我考虑将这一部分放到关键部分,但是,如果作家想写东西并且管道已满,那么我该如何只允许一个读者进入里面,然后再让作家写更多东西呢?
我很困惑...
任何帮助将不胜感激,谢谢!
不需要那么多互斥锁或在一定时间内锁定它们。 在单一生产者/消费者方案中,生产者无需担心可用空间的减少(这是唯一可以使用该空间的空间),对于消费者而言也是如此。 因此,您的伪代码应为:
制片人
while (lock_and_get_free_space() < bytes_to_write)
wait()
unlock()
write(bytes_to_write)
lock_and_update_free_space()
消费者
while (lock_and_get_data() < bytes_to_read)
wait()
unlock()
read(bytes_to_read)
lock_and_update_free_space()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.