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

namespace some_namespace
{
  static double some_double;
}

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


静态全局some_double仅在函数内部使用过,因此,如果我将其包装在CPython函数中并以单线程代码调用,则变量一次只能由一个函数使用。丑陋,但没有问题。我的问题是,如果我使用:


threading模块,或
multiprocessing模块。


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

最佳答案

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

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

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

关于c++ - Python中的静态全局变量不安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10464626/

10-14 12:50
查看更多