异步共享内存读/写
Asynchronous Shared Memory Read/Write
在我的应用程序中,我使用父级和子级之间的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
来检查它是否可以被锁定。与文件一样,是否有类似于select
或poll
的机制来检查多个信号量的状态,如果有人收到信号,则执行操作,而不是在单个信号量上被阻止?
poll
的机制。
我会用一根管子;它是由常规文件描述符管理的,所以你可以用poll
等来等待它
最简单的用途是通过它传递所有数据,而不是共享内存。如果将数据复制到内核内存中和从内核内存中复制数据的成本可能是一个问题,那么您可以保留共享内存,并通过管道发送单个字符作为信号,有效地将其用作信号量。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串