若想实现共享内存扩容,需要将持有该共享内存句柄进程线程关闭所持有的句柄,然后重新去申请共享内存。实现细节如下:
- 保证多进程线程中只有一个进程线程进行共享内存创建且持有创建返回的句柄。
- 其他访问共享内存的进程线程对共享内存操作完毕后,要关闭打开共享内存返回的句柄。
- 根据以上两点,事例如下:(并行本地任务的分发传递使用的共享内存扩容就是该机制)
程序1:程序1负责所有的共享内存创建,如客户端,一台机器只有一个客户端,且一直在线,满足了创建共享内存的进程只有一个,且一直持有共享内存句柄,防止所有进程都退出后,共享内存消失。
map<string,HANDLE> mapHandles;//保存创建的共享内存
createorgetmemory(memname,createorgetflag,memsize)
{
// 获取访问共享内存
if(get){
handle hmap = openfilemapping(…)
return hmap;
}
// 创建
handle hMap = maphandles[memname]
if(hmapnull){
handle hmap = openfilemapping(…)
//记录内存句柄
maphandles[memname] = hmap;
//映射到进程获取共享内存前四个字节共享内存的大小,若小了则关闭句柄重新创建,否则返回
//结束映射到进程并返回
//打开共享内存失败,证明共享内存不存在,则创建并写入创建的大小,然后返回
hMap = createfilemapping(…, memname)
if(hmapnull){
return false
}
//映射到进程并在共享内存前四个字节写入申请的大小
maphandles[memname] = hmap;
//结束映射到进程并返回
}
}
其他程序:
通过get访问共享内存后要释放句柄,防止程序1想扩容由于其他进程持有句柄而扩容失败。