在C ++中的Shared Lib(so)内的共享内存中创建一个对象

时间:2008-11-11 15:05:17

标签: c++ memory shared-libraries

是否可以在链接到此代码的每个人之间共享一个'god'实例,放在共享对象中?

god* _god = NULL;
extern "C" 
{

int set_log_level(int level)
{
    if(_god == NULL) return -1;
    _stb->log_level(level);
    return 0;
}

int god_init(){
    if(_god == NULL){
        _god = new god(); //Magic happens here
    }
}

}

如果我在每个函数的开头执行锁定同步,并考虑到上帝本身可以新建/ malloc其他东西,但这些东西永远不会自己返回给调用者(上帝mallocs仅供内部使用),如果可能的话,这是最简单的方法。

如何将其扩展到链接到此共享库的任意数量的程序?

3 个答案:

答案 0 :(得分:2)

Boost Interprocess库具有高(er)级别的可移植共享内存对象。

答案 1 :(得分:1)

这根本不是正确的做法。通过执行您的建议,变量yes是库的全局变量,因此是程序的全局变量,但数据对于实际运行的进程是私有的。您将无法在正在运行的程序中共享值。 @grieve是指由多个线程访问的全局,但线程共享相同的父流程实例。

在实际流程中,您需要突破到特定于操作系统的共享内存设施。 有关详细信息,请查看Shared Memory。这是一个可行的问题,但这并不是特别容易实现的。您还需要一个像Semaphores这样的进程间同步系统来协调使用。

答案 2 :(得分:0)

我觉得 god 将成为某种服务器。考虑使用适当的客户端/服务器架构,以使上帝远离群众。