在库中使用全局变量

时间:2014-03-08 13:55:40

标签: c++ concurrency global-variables static-linking dynamic-linking

假设我有一个带有全局变量的库,可以读取和写入操作。

我假设以下内容:

  • 静态链接库在不同的线程上不会安全使用。
  • 静态链接库在不同进程上同时安全使用。
  • 动态链接的库在不同的线程上不会安全地同时使用。
  • 动态链接库在不同进程上不会安全使用。

上述假设是否正确?

如果它有意义(尽管我认为它没有),那么我用C ++编写代码并在Windows上运行。

由于

2 个答案:

答案 0 :(得分:2)

您最后的假设是错误的,您不能在图书馆之间意外共享数据。

如何实现这一点是针对每种库格式和操作系统的,但主要思路很简单:

  • 代码是只读:它可以安全共享(想想int rand() { return 4; }
  • 常量只读:可以安全地共享它们(想想"Hello, World!"
  • 变量不是只读的:它们不是共享的(共享一个不可变的“模板”,并用于初始化进程自己的私有副本)

即使在Linux上使用fork,新创建的进程也不会共享其父进程中的变量;它将在副本中分享它们的初始值,但两者将以不同的方式发展。

话虽如此,只要避免全局变量;如果可能的话,还要避免使用线程局部变量。

答案 1 :(得分:1)

  

动态链接库在不同进程上不会安全使用。

这是错误的。

即使库在不同进程之间共享,也会考虑代码。但每个进程都将数据映射到其内存空间。因此,每个进程都有独立的全局变量,即使它们来自共享库。

更确切地说,here已经详细解释了它。

要让不同的进程共享一些内存,您需要使用特定的库,如shmget()shm_open()