异步共享内存读/写

Asynchronous Shared Memory Read/Write

本文关键字:内存 共享 异步      更新时间:2023-10-16

在我的应用程序中,我使用父级和子级之间的IPC共享内存(在Linux和Windows上)。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的机制来检查多个信号量的状态,如果有人收到信号,则执行操作,而不是在单个信号量上被阻止?

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

我会用一根管子;它是由常规文件描述符管理的,所以你可以用poll等来等待它

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