回复:共享内存和信号量

Posted

技术标签:

【中文标题】回复:共享内存和信号量【英文标题】:Re: Shared Memory and Semaphores 【发布时间】:2010-10-26 08:25:23 【问题描述】:

IPC 机制是否使用共享内存和信号量来同步单工(如管道)或双工(如消息队列)?

【问题讨论】:

【参考方案1】:

如果我对你的问题的理解是正确的,那就是双工。

使用共享内存,两个进程可以双向通信,而不仅仅是一个作为读取器,一个作为写入器。管道只允许读取或写入,但您可以通过使用两个管道来克服这个问题(尽管消息队列是更好的选择)。

【讨论】:

【参考方案2】:

信号量是这样工作的... proc a:“资源可用吗?”信号量 = -2 是的。信号量++ proc b: "是资源..." 信号量 = -1 是的。信号量++ proc c: "is the resource..." semaphore = 0 No. (什么都没有发生)

此时,proc c 可以排队(取决于您的 api,这可能是一个繁忙的循环,也可能是一个回调,或者您可能只是生成一个等待线程并编写自己的回调)

proc a: "im done" 信号量--;

proc c 会注意到信号量可用,可能类似于我之前提到的。

我写出所有这些的原因是我可以说,两者兼而有之。它就像一个消息队列,您可以让线程等待资源(由信号量控制的共享内存),当它们获得资源时触发一些操作,甚至是实际的系统消息。或者你可以忙着等待它完成,这就像管道一样。

【讨论】:

以上是关于回复:共享内存和信号量的主要内容,如果未能解决你的问题,请参考以下文章

如何通过子进程之间的共享内存共享信号量?

Posix共享内存

C 中具有共享内存和信号量的客户端服务器程序

linux共享内存和mmap的区别

使用信号量进行共享内存同步

Linux Program信号量共享内存和消息队列