繁体   English   中英

使用共享内存和信号量实现管道

[英]Implementing pipe using shared memory & semaphores

我正在尝试使用共享内存和信号量来实现管道(可能还需要信号以完成实现)

我遇到了如何正确设置信号量的算法问题。

可以说我已经为管道缓冲区分配了一块共享内存,并为管道信息分配了一块共享内存(例如管道中有多少字节,等等。)

  1. 我要创建互斥(一次只能使用一位读者/作家使用管道)
  2. 如果读者想从空的管道中读取,我应该阻止他,直到作家写点东西为止
  3. 像“ 2”一​​样,但写完整管道的作家

我试图寻找答案,但即使看起来很普通,也没有找到答案。

我知道一种称为“边界缓冲区问题”或“消费者生产者问题”的解决方案,其实现方式如下:

共有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM