【问题标题】:Are static global variables in CPython unsafe?CPython 中的静态全局变量不安全吗?
【发布时间】:2012-05-14 22:20:00
【问题描述】:

在我用 python 函数包装的一个 C++ 源文件中,有人包含以下内容:

namespace some_namespace 
{ 
  static double some_double; 
}

float function_that_uses_some_double(float input) { 
  // implementation
  return result; 
}

静态全局 some_double 只在函数内部使用,因此如果我将它包装在 CPython 函数中并在单线程代码中调用它,则该变量一次只能被一个函数使用。这很丑陋,但那里没有问题。我的问题是如果我使用会发生什么:

  1. threading 模块,或
  2. multiprocessing 模块。

当我有多个进程和/或线程使用此模块时,它们会相互干扰吗?

【问题讨论】:

    标签: c++ multiprocessing cpython


    【解决方案1】:

    如果您使用 threading 模块,那么所有函数将简单地共享该全局变量。 python 中的线程在字节码边界之间切换,因此锁定不是问题。

    如果您使用多处理模块,情况会有所不同,这在一定程度上取决于您对多处理的使用。 Python 从单个进程开始,因此全局变量只有一个副本。当您开始使用多处理(即从主进程派生新的 Python 进程)时,该变量的值将被复制到子进程(任务)中,但这些进程将各自拥有自己的全局变量副本。

    如果您设置了一个共享内存段(带有 MAP_SHARED 的 mmap)并且变量是一个指针,那么指向的位置将被共享,您将需要使用锁定。

    【讨论】:

      【解决方案2】:

      如果您要更改 some_double(我假设您是因为它不是 const 变量),那么如果您使用多个线程,则必须进行某种锁定(例如互斥锁)。

      【讨论】:

      • 这不是问题所在。仅从 CPython(使用其臭名昭著的 GIL)调用函数这一事实可能会发生很大变化。而且您也没有解决多处理问题。
      • 我认为,如果您的线程创建是在 Python 中创建的,而 Python 又会调用您的 CPython 函数,那么 Python 会自动为您完成锁定(通过 GIL)。但是如果你在你的 C++ 代码中创建线程,你必须自己获取、锁定、释放 GIL。抱歉,我不熟悉 Python 多进程模块。
      • 线程只能在 python 中创建。不过,他们每个人都可以调用这个函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      • 2012-12-30
      • 2011-04-11
      相关资源
      最近更新 更多