再来看看一个包走共享内存的流程
先来看看net进程这块如何处理的
{//用shareData这种类型封装刚才从无锁队列中取到的包
shareData sd;
sd.channel_id = pkt.channel_id;
sd.data = pkt.data;
sd.is_data = pkt.is_data;
sd.size = pkt.size;
auto hr = m_spShareMemInter->pushA(sd);//将这个包放入共享内存中
}
//具体看下是如何放入共享内存的
bool shareMemInterOneway::pushIn(shareData sd)
{
scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);//需要加进程锁,不同进程访问
shareDataEx sd2;
bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);
if(!hr)
return false;
sd2.size = sd.size;
sd2.channel_id = sd.channel_id;
sd2.is_data = sd.is_data;
if(sd.is_data)
{
memcpy(sd2.data, sd.data, sd.size);
}
m_ShareMemQue->push_back(sd2);
return true;
}
bool ProcessMemPoolEx::getPkt(int len, shareDataEx& sd)
{
if(len < )//根据长度判断从哪种共享内存中取
return m_ProcessMemPool0.getPkt(len, sd);
else if(len < )
return m_ProcessMemPool1.getPkt(len, sd);
return m_ProcessMemPool2.getPkt(len, sd);
}
bool ProcessMemPool::getPkt(int len, shareDataEx& sd)
{
if(len > m_memSize)
{
//测试
wchar_t tips[] = {};
wsprintf(tips, L"Warning100o: len:%d, memSize:%d!", len, m_memSize);
MessageBox(NULL, tips/*L"100o"*/, L"1ooo", MB_OK);
return false;
}
if(!m_queue->size())
return false;
sd = m_queue->front();//看到这个就应该知道为什么要初始化那个共享的队列
m_queue->pop_front();
sd.data = convertAdd(sd.index);
return true;
}
void* ProcessMemPool::convertAdd(int index)
{
return (char*)m_start_addr + (index * m_memSize);//正好通过这个index获取共享内存池的相应地址
}
附:m_queue初始化代码:
{
for (int i = ; i < m_buffer_num; i++)
{
shareDataEx sd;
sd.index = i;//正是用这个index代表了内存池的哪一块
sd.size = ;
sd.total_size = m_memSize;
m_queue->push_back(sd);
}
}
bool shareMemInterOneway::pushIn(shareData sd)
{
scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);
shareDataEx sd2;
bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);//在调用Getpkt之后就会获得一块内存的地址
if(!hr)
return false;
sd2.size = sd.size;
sd2.channel_id = sd.channel_id;
sd2.is_data = sd.is_data;
if(sd.is_data)
{
memcpy(sd2.data, sd.data, sd.size);//然后就将传递进来的sd内存复制到共享内存中的内存池,而sd中的这个内存就是那个m_recvBuff里面的,有个问题就是这个m_recvBuff为什么要分配100m的内存,需要这么大么?
}
m_ShareMemQue->push_back(sd2);//然后他将这个sd2放到放到交互的共享队列中,注意这里面的内存还是分配在共享内存池中的,m_ShareMemQue中只是保存了一个地址而已
return true;
}//这样一个包就放入共享的队列中了