Python中的静态全局变量是否不安全?

时间:2012-05-05 18:13:17

标签: c++ multiprocessing cpython

在我正在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模块。
  3. 当我使用此模块有多个进程和/或线程时,它们是否会相互干扰?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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