c++ - 在库中使用全局变量

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

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

我假设如下:

  • 静态链接库在不同线程上并发使用时不安全。
  • 静态链接库可以在不同进程上同时安全使用。
  • 动态链接库无法在不同线程上同时安全使用。
  • 动态链接库无法在不同进程上同时安全使用。

以上假设正确吗?

如果有什么重要的话(尽管我认为并不重要),那么我将使用 C++ 进行编码并在 Windows 上运行。

谢谢

最佳答案

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

这是如何实现的,具体取决于每个库格式和操作系统,但主要思想很简单:

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

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

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

关于c++ - 在库中使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270237/

相关文章:

c++ - EnterCriticalSection 不锁定

Haskell 并发 - forkIO 真的是不确定的吗?

Javascript:for 循环 'for(i=0; i < 3 ; i++)' 在没有使用 continue、break 或 return 的情况下过早终止

c# - 调用外部 C++ 方法时无法识别字节数组

c++ - 如何用 C++/Qt 解析 HTML?

haskell - Haskell 中的并发文件读/写?

c# - 我成功解析了 URL,但无法将字符串变量传递给方法 C#

c - c 中为全局变量和局部变量分配的内存 : is it different

c++ - 滚动条对数行为

java - ExecutorService "happens-before"中的 awaitTermination 是否在其后执行任何代码?