共享内存由于其特殊性—共享内存是存在与每个进程的地址空间中的,通俗点就是这部分数据是对每个进程可见的,这样每个进程都可以在一定条件下直接操作共享内存中的数据,避免了数据的复制等耗时的操作,这也是共享内存比其他几种IPC机制(信号量、管道、消息队列等)的通信方式效率高的原因。
测试程序
1、赋值进程
#include <QCoreApplication>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <unistd.h>
struct robot
{
double x;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//boost::interprocess::shared_memory_object::remove("share");
boost::interprocess::managed_shared_memory m_managed_shm;
robot *rob;
m_managed_shm = boost::interprocess::managed_shared_memory(boost::interprocess::open_or_create, "share", sizeof(struct robot) + 1024);
rob = m_managed_shm.find_or_construct<struct robot>("data")();
boost::interprocess::interprocess_mutex *m_pMtx;
m_pMtx = m_managed_shm.find_or_construct<boost::interprocess::interprocess_mutex>("mtx")();
rob->x = 0;
int count = 0;
while(count<30)
{
count ++;
m_pMtx->lock();
rob->x++;
m_pMtx->unlock();
sleep(1);
}
boost::interprocess::shared_memory_object::remove("share");
return a.exec();
}
2、取值进程
#include <QCoreApplication>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <unistd.h>
struct robot
{
double x;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
boost::interprocess::managed_shared_memory m_managed_shm;
robot *rob;
m_managed_shm = boost::interprocess::managed_shared_memory(boost::interprocess::open_or_create, "share", sizeof(struct robot) + 1024);
rob = m_managed_shm.find_or_construct<struct robot>("data")();
boost::interprocess::interprocess_mutex *m_pMtx;
m_pMtx = m_managed_shm.find_or_construct<boost::interprocess::interprocess_mutex>("mtx")();
int count = 0;
while(count<30)
{
count ++;
m_pMtx->lock();
std::cout<<"rob->x = "<<rob->x<<std::endl;
m_pMtx->unlock();
sleep(1);
}
boost::interprocess::shared_memory_object::remove("share");
return a.exec();
}