【发布时间】:2009-02-24 13:41:50
【问题描述】:
我编写了一个 C++ 类,我需要在至少两个 Windows 进程之间共享一个实例。有哪些不同的方法可以做到这一点?
最初我研究了#pragma data_seg,但当我意识到它不适用于类或任何在堆上分配的东西时,我感到很失望。
类的实例必须可以通过 dll 访问,因为现有的完整应用程序已经使用此 dll。
【问题讨论】:
我编写了一个 C++ 类,我需要在至少两个 Windows 进程之间共享一个实例。有哪些不同的方法可以做到这一点?
最初我研究了#pragma data_seg,但当我意识到它不适用于类或任何在堆上分配的东西时,我感到很失望。
类的实例必须可以通过 dll 访问,因为现有的完整应用程序已经使用此 dll。
【问题讨论】:
您可以潜在地使用memory-mapped files 在进程之间共享数据。如果您需要在对象上调用函数,则必须使用 COM 或类似的东西,或者您必须实现自己的 RPC 协议。
【讨论】:
查看Boost::interprocess。这需要一点时间来适应,但效果很好。我在共享内存中创建了相对复杂的数据结构,可以在进程之间正常工作。
edit:它也适用于内存映射文件。关键是您可以以结构化的方式使用数据;您不必将内存块(在文件或共享内存中)视为您必须仔细读/写才能保持有效状态的原始数据。 Boost::interprocess 负责该部分,您可以使用 STL 容器,如树、列表等。
【讨论】:
您可以使用placement new 在共享内存区域中创建对象。只要对象不使用任何指针,就可以了。
【讨论】:
它是 POD 还是您需要能够跨进程共享单个实例?您是否考虑过使用单例模式(静态初始化版本,出于线程安全原因)?您还需要使用互斥锁来保护并发写入和内容。
在 Windows 上,您也可以使用 COM。
【讨论】: