假设我有两个文件,main1.cc
和main2.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。当然,发送消息的成本很高(但这是数据中心云计算的基础(。这可能需要几毫秒,而不是几纳秒。