c - Unix信号量问题

标签 c unix semaphore shared-memory

有没有办法用unix信号量设置它们的值?我需要始终从多个消费者调用 post() ,并且偶尔调用 wait() ,它将等待下一个 post() 发生。

如何实现这一目标?

原因是我正在实现生产者/消费者问题(1 个生产者/最多 2 个消费者)。每个消费者都有一个内部队列,其中存储似乎无法放在输出上的项目,因为其他消费者仍然缺少其他数据包,因此它们都以正确的顺序输出(因为它们来自生产者) 。当任何队列被认为已满时(比方说,有 10 个项目),我希望该进程等待,直到另一个进程完成其工作(因为只有 2 个进程,我保证其他进程的数据包正在产生的是我需要开始做一些输出的数据包!)。

我的想法是,每次消费者处理任何内容并查找将其放入输出中时,它都应该调用信号量上的 post() 之类的东西。每当消费者的队列已满时,它应该对同一个信号量执行某种 wait() 操作。这样,当另一个消费者完成其工作时,这个消费者就会被唤醒。

这种情况应该如何解决?我走在正确的道路上吗?在这个项目中,我仅限于使用信号量和共享内存。

当然,我们的想法是尽可能避免旋转。

谢谢

最佳答案

看来您最需要一个屏障来同步您的消费者。 看来Posix给出了它的实现(pthread_barrier_*)。

因此,请与消费者数量建立共同的障碍;当消费者完成时,它必须“在屏障处等待”。

否则,您可以使用另一个信号量来实现它。

关于c - Unix信号量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4373637/

相关文章:

c - C中的字符串和字符连接

c - 动态规划问题-斐波那契数列

c++ - 链接器实际上如何处理多重定义的 `inline` 函数?

使用 Valgrind 检查内存

linux - awk 中的 tr 命令更改列值

go - 如何等到缓冲 channel (信号量)为空?

linux - 尝试根据菜单输出来验证 PS3 输入以进行用户验证

linux - 如何在gnuplot中将字符串转换为数字

c - 我应该如何用计数模拟 sem_wait?

linux - 关于使用信号量执行线程的操作系统作业问题