关于共享内存的使用
来源:互联网 发布:软件测试的基本技能 编辑:程序博客网 时间:2024/04/27 16:46
前一段时间参加一个项目,设计一个热加载配置的功能,配置是在主进程中加载的,现在期望在主进程中重新加载配置子进程也可以生效。
原来的设计方案是:
新增信号处理函数,每次修改完配置,发送重新加载配置的信号,修改标志位,主进程的主循环中判断标志位是否修改。
int g_loadconf = 0;
signal(SIGALRM,(sighandler_t)notify_gracefully_loadconf );
void notify_gracefully_loadconf()
{
g_loadconf = 1;
}
main
{
g_config = mmap();
config_swap = mmap();
main_loop{
if(g_loadconf=1) {
g_loadconf = 0;
//不直接用g_config,因为load_config方法中可能有对g_config每一项逐项赋值,整个函数调用非原子性。
//如果直接对g_config中每项赋值,因为是共享内存,存在子进程可能访问到部分修改后的数据的问题
load_config( config_swap , config_file);
/*直接交换指针*/
temp = g_config;
g_config = config_swap;
config_swap = temp
}
}
}
改完以后发现使用有问题,仔细看了一下,原来g_cong的类型中包含一些非基础类型的变量。如vector、map或未初始化的指针等。
这些非基础的类型使用过程中存在申请动态内存,而动态申请的内存在进程的地址空间内;如在主进程动态申请的内存空间,子进程访问会出错。
所有在使用共享内存的时候,最好保证全部是基础类型,如果存在动态申请内存的操作,可能不适合使用共享内存。
- 关于共享内存的使用
- 共享内存的使用
- 共享内存的使用
- 共享内存的使用
- 共享内存的使用
- 共享内存的使用
- 共享内存的使用
- 关于共享内存的利用
- linux 共享内存的使用
- linux 共享内存的使用
- Qt共享内存的使用
- linux 共享内存的使用
- 关于共享内存的一些心得
- 关于Java的共享内存机制
- 关于numpy中内存共享的问题
- 关于回调函数、共享内存的使用,以及进程间函数调用的讨论
- 关于Posix共享内存
- 【Swoole】关于共享内存
- 关于每天的工作量,集中精力干一件事,其他时间就是玩,逐步完善自己的时间分配
- 关于maven的基本理解
- linux查找指定大小的文件
- ios第3天的气泡作业
- 【HDU】 2602 Bone Collector
- 关于共享内存的使用
- 程序猿之华丽转身:菜鸟4步曲!
- C和C++语言编程里面常用函数或者编程技巧总结(不断更新)
- select()实现
- 电容式触控芯片FAQ
- 【HDU】 2191 救灾
- Android学习路线
- auto_ptr STL智能指针
- word2vec 背景知识