2012-05-05 88 views
0

在一个C++源文件,我包裹在一个Python函数,有人已经包括了以下内容:CPython中的静态全局变量是否不安全?

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模块。

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

回答

1

如果使用线程模块,然后所有功能都简单地共享全局变量。 python中的线程在字节码边界之间切换,所以锁定不成问题。

如果使用多道处理模块,事情是不同的,这要看你多的使用了一下。 Python从一个进程开始,所以只有一个全局变量副本。当你开始使用多(即分叉从主流程新工艺的Python)的该变量的值将被复制到子进程(任务),但这些过程将各自有自己的全局变量的副本。

如果你遇到困难并且设置了一个共享内存段(mmap和MAP_SHARED)并且该变量是一个指针,那么指向的位置将被共享,你需要使用锁定。

0

如果你要改变some_double(我假设你是因为它不是一个const变量),那么你将不得不做一些锁定(例如互斥体),如果你使用多线程的。

+1

这不是问题。这个函数只能从CPython中调用(它的臭名昭着的GIL)可能会改变很多。而且你也没有解决多处理问题。 – delnan

+1

我认为,如果你的线程的创建是在Python,后者又调用您的CPython的函数,则锁定(通过GIL)为您被Python自动完成。但是如果你在你的C++代码中创建线程,你必须自己获取,锁定和释放GIL。对不起,我不熟悉Python多处理模块。 –

+0

线程只能在python中创建。不过,它们中的每一个都可能调用这个函数。 – Shep