【问题标题】:Asynchronous Shared Memory Read/Write异步共享内存读/写
【发布时间】:2014-10-26 13:01:13
【问题描述】:

在我的应用程序中,我在父子之间(在 Linux 和 Windows 上)为 IPC 使用共享内存。 Linux 的完整代码位于https://github.com/devendermishra/SharedMemoryTest/blob/master/shmem_linux.cpp

我在 Linux 上有以下代码可以从共享内存中读取:

char buf[BUF_SIZE/4];
//pBuf is the shared memory location

sem_wait(semn);
//Wait for the parent process to write on the shared memory.
memcpy(buf, pBuf, sizeof(buf));
//Signal the parent
sem_post(sem0);

如下代码编写:

//Data is in buf, pBuf is shared memory.
memcpy(buf, pBuf, sizeof(buf));
sem_post(semn);
sem_wait(sem0);

在这种情况下,如果一个进程长时间不写,那么另一个进程将无限期地等待。一种解决方案是在操作无法完成时使用sem_trywait 立即返回。但在这种情况下,需要有人再次调用sem_trywait 来检查是否可以锁定。像文件一样,是否有任何类似于selectpoll 的机制来检查多个信号量的状态,如果有人收到信号,则执行操作而不是被单个信号量阻塞?

【问题讨论】:

    标签: c++ c linux shared-memory semaphore


    【解决方案1】:

    对于 Posix 信号量,没有类似于 poll 的机制。

    我会使用管道;它由常规文件描述符管理,因此您可以使用poll 等来等待它。

    最简单的用法是通过它而不是共享内存传递所有数据。如果将数据复制进和复制出内核内存的成本可能是一个问题,那么您可以保留共享内存,并通过管道发送单个字符作为信号,有效地将其用作信号量。

    【讨论】:

    • 感谢您的快速回答。我认为即使是unix套接字和临时文件也可以用作信号。这其中哪个表现好?是否有理由选择管道作为信号而不是其他信号?
    • @dbasic:Unix 套接字可能具有与管道相似的行为和性能,但我对它们了解不多。我不会使用文件;该行为不是您想要简单传输数据的行为,将其写入磁盘可能会影响性能,并且它的持久性可能会在您启动和停止程序时导致复杂性。
    • 这个问题不是关于管道而是关于信号量,这是 IPC 的两种不同方式。你没有回答这个问题
    • @Maciej:“有没有类似于selectpoll 的机制来检查多个信号量的状态?”信号量没有这样的机制,所以我描述了一个替代方案。
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 2018-09-23
    • 2011-09-12
    • 2012-05-24
    • 2010-11-28
    • 2016-12-13
    • 2012-12-31
    • 2012-04-27
    相关资源
    最近更新 更多