当前位置: 首页 > 知识库问答 >
问题:

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

宗政唯
2023-03-14
    null

有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)

如有任何帮助,不胜感激,谢谢!

共有1个答案

羊冠玉
2023-03-14

没有必要有这么多互斥或锁定它们这么长时间。在单个生产者/消费者场景中,生产者从来不需要担心空闲空间的减少(它是唯一一个可以用完空闲空间的生产者),对于消费者来说也是如此。因此,您的伪代码应该是:

生产者

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()
 类似资料:
  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:

  • 我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c

  • 我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?

  • 程序应该创建200000个整数,并将2000个写入共享内存。分叉进程应该从共享内存中读取2000,父进程应该将下一个2000写入共享内存。 请帮帮我们谢谢你们 编辑:非常感谢您的回答。我不能标出正确的答案,因为我不知道什么是正确的。但我不想再尝试了。15个小时就够了

  • 我在Linux上使用C。我需要构建使用共享内存和信号量进行通信的两个程序。 其中一个程序必须充当服务器(一次只能充当一个),另一个程序必须充当客户机(一次任意数量)。通信应遵循以下模式: 我知道如何在两个进程之间使用共享内存和信号量,但我不知道如何在数量不明的进程之间进行通信时使用它们。我考虑为每个客户机使用共享内存块,但我必须交换密钥并通知服务器新的客户机。所以这并不能解决问题。