Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CPython中的静态全局变量是否不安全? 在一个用Python函数包装的C++源文件中,有人包括以下内容: namespace some_namespace { static double some_double; } float function_that_uses_some_double(float input) { // implementation return result; }_C++_Multiprocessing_Cpython - Fatal编程技术网

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中创建。不过,它们中的每一个都可以调用此函数。