CPython中的静态全局变量是否不安全? 在一个用Python函数包装的C++源文件中,有人包括以下内容: namespace some_namespace { static double some_double; } float function_that_uses_some_double(float input) { // implementation return result; }
静态全局CPython中的静态全局变量是否不安全? 在一个用Python函数包装的C++源文件中,有人包括以下内容: namespace some_namespace { static double some_double; } float function_that_uses_some_double(float input) { // implementation return result; },c++,multiprocessing,cpython,C++,Multiprocessing,Cpython,静态全局some\u double只在函数内部使用,因此如果我将其包装在CPython函数中并在单线程代码中调用它,那么该变量一次只能由一个函数使用。很难看,但没问题。我的问题是,如果我使用: 线程模块,或 多处理模块 当我有多个进程和/或线程使用此模块时,它们会相互干扰吗 如果要更改某个双精度(我假设是因为它不是常量变量),那么如果使用多个线程,则必须执行某种类型的锁定(例如互斥)。如果使用线程模块,则所有函数都将共享该全局变量。python中的线程在字节码边界之间切换,因此锁定不是问题 如果
some\u double
只在函数内部使用,因此如果我将其包装在CPython函数中并在单线程代码中调用它,那么该变量一次只能由一个函数使用。很难看,但没问题。我的问题是,如果我使用:
线程
模块,或多处理
模块李>
当我有多个进程和/或线程使用此模块时,它们会相互干扰吗 如果要更改某个双精度(我假设是因为它不是常量变量),那么如果使用多个线程,则必须执行某种类型的锁定(例如互斥)。如果使用线程模块,则所有函数都将共享该全局变量。python中的线程在字节码边界之间切换,因此锁定不是问题 如果您使用多处理模块,情况就不同了,这在一定程度上取决于您对多处理的使用情况。Python从一个进程开始,因此只有一个全局变量的副本。当您开始使用多进程(即从主进程派生新的python进程)时,该变量的值将被复制到子进程(任务)中,但这些进程都有自己的全局变量副本
如果您设置了一个共享内存段(mmap with MAP_shared),并且变量是指针,那么指向的位置将被共享,您需要使用锁定。这不是问题所在。这些函数仅从CPython(其臭名昭著的GIL)调用这一事实可能会发生很大变化。我认为如果你的线程是用Python创建的,而Python又调用了你的CPython函数,那么锁定(通过GIL)是由Python自动完成的。但是如果你在C++代码中创建线程,你必须自己获取、锁定、释放吉尔。抱歉,我不熟悉Python多处理模块。线程将仅在Python中创建。不过,它们中的每一个都可以调用此函数。