Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中的共享库(so)内的共享内存中创建对象+;_C++_Memory_Shared Libraries - Fatal编程技术网

C++ 在C+中的共享库(so)内的共享内存中创建对象+;

C++ 在C+中的共享库(so)内的共享内存中创建对象+;,c++,memory,shared-libraries,C++,Memory,Shared Libraries,是否可以在链接到此代码的每个人之间共享一个“上帝”实例,并将其放置在共享对象中 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(); //

是否可以在链接到此代码的每个人之间共享一个“上帝”实例,并将其放置在共享对象中

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
    }
}

}
假设我在每个函数开始时都执行锁同步,并且考虑到God本身可以创建新的/malloc其他东西,但是这些东西永远不会返回给调用方(God mallocs仅用于内部使用),如果可能,最简单的方法是什么


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

这根本不是正确的方法。按照您的建议,变量yes是库的全局变量,因此也是程序的全局变量,但是数据对于实际运行的进程是私有的。您将无法在运行的程序之间共享这些值@Grive指的是由多个线程访问的全局进程,但线程共享同一父进程实例

在实际的进程中,您需要切换到特定于操作系统的共享内存设施。
看一看细节。这是一个可行的问题,但它并不是特别容易实现的。您还需要一个进程间同步系统,如信号灯,以协调使用。

我感觉上帝将是某种服务器。考虑使用适当的客户机/服务器体系结构,以保持上帝远离大众。

库具有高(ER)级,可移植的共享内存对象。

这通常称为单体。不,他希望在所有链接的进程之间共享一个实例。除了使用RPC之外,没有其他方法来解决这个特定的问题。但这在我正在开发的应用程序中造成了严重的性能问题。还要记住,我并不拥有/控制所有需要链接的代码,所以我不能修改它。共享内存不是RPC。RPC是数据序列化的远程过程调用,共享内存就是进程之间共享的内存。除了任何同步问题,这是“全速”本机内存。威尔,你为什么说“数据对..进程是私有的”?埃杜说,他将把所有数据放在共享内存段中“上帝”和它创建的所有对象都将在共享内存中,使用自定义运算符new()或他正在使用的任何其他内存分配系统。不,他说他正在将数据放入共享对象中。他希望在一个文件中定义一个对象,并仅通过使用链接器在进程之间“神奇地共享”该对象。链接器不能也不会这样做。任何库中的任何“全局”数据,即使是“共享”库,都是流程的本地数据。您必须使用一些基于操作系统的进程外功能(如共享内存)来实现他想要的功能,而这并不是“免费”的(不过,很明显,Boost库中有一些实用程序可以更方便地实现这一过程)。