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库中有一些实用程序可以更方便地实现这一过程)。