0

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

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

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

  1. 我想创建互斥(一次只有一个读取器/写入器使用管道)
  2. 如果读者想从空管道中阅读,我应该阻止他,直到作家写东西
  3. 与“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'个字节......

这意味着写入者在写入之前必须检查管道中有多少可用空间。这是一个问题 - 因为作者将在没有互斥的情况下触及关键部分(管道的信息)。

所以我想把这部分放在关键部分,但是 - 如果一个作家想写并且管道已经满了 - 我怎么能只让一个读者在里面,然后让作家写更多呢?

我已经糊涂了...

任何帮助将不胜感激,谢谢!

4

1 回答 1

0

没有必要拥有这么多互斥锁或在这段时间内锁定它们。在单一生产者/消费者场景中,生产者无需担心可用空间减少(它是唯一可以用完该空间的空间),消费者也同样如此。因此你的伪代码应该是:

制片人

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()
于 2013-02-12T01:25:47.097 回答