2012-05-05 137 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