Linux下以队列的方式封装使用共享内存

前言

  • 起因
    两个进程之间需要图片的传输,之前的程序会导致三次额外的文件IO
  • 过程
    起初是部门老哥建议使用boost封装好的共享内存进行开发,其中也封装好了相应的queue和string类,用以存储图片数据,后来发现使用时,按boost的方法开辟的单个共享内存区域的大小过小,可能是自己使用的方式有所不对,网上查阅资料无果,故而放弃。
    ps: 放一个boost共享内存的相关网址,算是在学习中看到的最好的一个,有需要的可以看一下
    http://zh.highscore.de/cpp/boost/interprocesscommunication.html

思路

直接说结果吧,最后选择了消息队列来实现队列思维和锁

Created with Raphaël 2.3.0 存图程序启动 按照预定产生shmid,保存至/etc/xx.txt shmid保存至idque,映射出地址,保存至map 启线程,用以接收消费者消费完对应内存块后数据,返回 shmid 对外的接口,填入数据后,消息队列中的消息传递shmid
Created with Raphaël 2.3.0 取图程序启动 等待存图程序初始化完成 读取/etc/xx.txt中的shmid,映射出地址,保存至map 启线程,用以接收生产者填充完对应内存块后数据,返回 shmid 处理完成后将shmid返回给生产者意味该区域为空 yes no

我这里用消息队列传递了shmid,也就是借助消息队列监听不同频道的消息,来直接传输,生产者传输我填充好的内存块,接收被消耗的内存块, 消费者等待接收被填充的内存块,发送取走数据的内存块

填充好数据的内存块的shmid
循环等待生产
循环等待消费
消费后空闲的shmid
接收到填充好的id
接收到空闲id后
生产者
消费者
回调至外部处理
填入dique队尾

代码连接:
https://gitee.com/plain-glass/sharedmemory

你可能感兴趣的:(linux,服务器,共享内存,c++)