跨平台场景下C++与Python通过共享内存实现高速通信的问题咨询
跨C++与Python跨平台共享内存方案
现有报错问题修复
你遇到的FileNotFoundError报错不是multiprocessing.shared_memory不支持跨语言通信,而是Windows平台命名规则不匹配导致:
- Windows系统下共享内存属于内核对象,普通用户进程创建的共享内存默认归属
Local命名空间,名称需要带Local\\前缀 - Boost.Interprocess创建共享内存时不会自动补充此前缀,Python的
multiprocessing.shared_memory模块默认会自动补充,二者命名不匹配导致无法找到对象
修复代码示例
C++端(跨平台适配)
#include <boost/interprocess/shared_memory_object.hpp> #include <boost/interprocess/mapped_region.hpp> #include <cstring> #include <cstdlib> #ifdef _WIN32 #define SHM_NAME "Local\\myshm" #else #define SHM_NAME "myshm" #endif int main(int argc, char* argv[]) { using namespace boost::interprocess; // 启动和退出时清理残留共享内存 struct shm_remove { shm_remove() { shared_memory_object::remove(SHM_NAME); } ~shm_remove() { shared_memory_object::remove(SHM_NAME); } } remover; // 创建共享内存,开放所有用户读写权限避免权限不足问题 shared_memory_object shm(create_only, SHM_NAME, read_write, 0666); // 按4K RGB单帧大小设置容量(约24MB,可按需调整) shm.truncate(24 * 1024 * 1024); // 映射到进程地址空间 mapped_region region(shm, read_write); // 写入测试数据 std::memset(region.get_address(), 1, region.get_size()); std::system("pause"); return 0; }
Python端
from multiprocessing import shared_memory if __name__ == "__main__": shm_a = shared_memory.SharedMemory(name="myshm", create=False) buffer = shm_a.buf print(buffer[0]) # 使用完后关闭 shm_a.close()
性能对比说明
- 纯共享内存方案:完全不涉及磁盘IO同步,读写延迟在微秒级,带宽上限等于内存总线速度,完全可以满足4K 30fps(总带宽约720MB/s)的实时传输需求,是当前场景的最优选择。
- mmap方案:只有持久化到物理磁盘的mmap文件会因为磁盘同步产生明显性能损耗,Linux下基于tmpfs的mmap、Windows下基于系统页文件的mmap,性能和纯共享内存几乎没有差异,性能差距在5%以内,可作为备用方案。
额外优化建议
- 配套使用跨进程信号量做读写同步,避免同时读写出现数据撕裂,Boost.Interprocess和Python
multiprocessing模块都自带跨平台信号量实现。 - 可在共享内存中实现环形队列缓存多帧数据,避免生产消费速度波动导致丢帧。
- 若带宽仍有冗余,可在C++端做轻量化无损压缩后再写入共享内存,进一步降低内存拷贝开销。
内容的提问来源于stack exchange,提问作者poukill
相关产品推荐
相关产品推荐

