如何在两个可执行文件之间共享全局变量



假设我有两个文件,main1.ccmain2.cc,每个文件都有一个主函数,每个文件中都定义了一组全局变量:

main1.cc

int main1_global = 1;
int main() {
// I am main 1
}

main1_globals.h

extern int main1_global;

main2.cc

#include "main1_globals.h"
int main2_global = 2;
int main() {
// I am main 2
}

问题是main2.cc使用main1_global,如果我尝试链接和编译main2,它会抱怨main有多个定义。

理想情况下,我不应该将main1链接到main2,但我希望main2包含main1中的全局变量。在不链接main1的情况下,将全局变量从main1链接到main2的最佳方法是什么?

将常量放在一个单独的文件中,例如globals.h。然后将此文件包含在两个可执行文件中。

如何在两个可执行文件之间共享全局变量?

在大多数操作系统上,每个可执行文件(通过编译然后链接C++文件获得(都在自己的进程中运行,每个进程都有自己的虚拟地址空间。阅读一些好的操作系统教科书了解更多信息。

在实践中,您无法轻松共享全局变量,如果可以,则会出现同步问题(如果一个多核处理器同时运行可执行文件1和另一个可执行文件2,会发生什么情况?(。

您可能想要一些进程间的通信。如果可能的话,共享一个全局变量可能会耗费大量的CPU时间。

如果在Linux上,请参阅syscalls(2(、mmap(2(,pipe(7(,socket(7(、poll(2(和shm_overview(7(

对于Windows,请学习WinAPI

您可以重新设计软件的体系结构以使用多线程,例如C++std::thread-s,但您可能还需要用于锁定目的的std::mutex和用于同步的std::condition_variable-s。

请注意CPU缓存和缓存一致性问题。即使共享全局变量,也可能存在性能问题。

您可以重新设计应用程序以使用消息传递范式,例如使用JSONRPC、MPI或ONCRPC。当然,发送消息的成本很高(但这是数据中心云计算的基础(。这可能需要几毫秒,而不是几纳秒。

相关内容

  • 没有找到相关文章

最新更新