在库中使用全局变量

Using global variables in a library

本文关键字:全局变量      更新时间:2023-10-16

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

我假设以下内容:

  • 静态链接的库将不会在不同的线程上同时使用。
  • 静态链接的库将是在不同的过程上同时使用。
  • 动态链接的库将不同时使用不同的线程。
  • 动态链接的库将在不同的过程中同时使用。

上面的假设正确吗?

如果任何事情都很重要(尽管我想这不是),那么我正在用C 编码并在Windows上运行。

谢谢

您的最后一个假设是错误的,您不能在库之间意外共享数据。

如何实现这是针对每个库格式和操作系统的特定特定的,但是主要思想很简单:

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

即使在Linux上使用fork时,新创建的过程也不会从其父进程共享变量。它将在A copy 中共享其初始价值,但两者都会以不同的方式发展。

话虽如此,只需避免全球变量即可;如果可能的话,还避免了线程 - 本地变量。

动态链接的库将在不同的过程上同时使用。

这是错误的。

即使库在不同的过程之间共享,这也为代码。但是每个过程映射 data 到其内存空间。因此,每个过程都有独立的全局变量,即使它们来自共享库。

更准确地说,在这里得到了很好的细节解释。

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