2017-05-08 277 views
0

我將Python嵌入到多線程C++應用程序中,在多線程中調用 Py_Initialize()是否安全?或者我應該在主線程中調用它?在多線程中調用Py_Initialize()

+0

可能重複[是否線程安全地修改靜態變量?](http://stackoverflow.com/questions/43837721/is-it-thread-safe-to-modify-a-static-variable) –

+0

你已經問過這個問題;儘管重點不同。請參考我的答案重複。 –

回答

0

Py_Initialize()代碼包含:

if (initialized) 
    return; 
initialized = 1; 

該函數的文檔也說:

這是一個無操作時,要求第二時間(不先調用Py_Finalize())。

我的建議雖然只是從主線程來做,儘管取決於你在做什麼,它可能會變得複雜。

問題是信號處理程序只在主Python線程的上下文中觸發。也就是說,無論什麼線程都可以稱爲Py_Initialize()。所以如果這是一個暫時的線程,並且只使用一次然後丟棄,那麼就沒有機會調用信號處理程序。所以你必須考慮一下你如何處理信號。

還要小心使用本地線程API在C代碼中創建大量瞬態線程,並調用Python解釋器,因爲每個線程都將在Python解釋器中創建數據。如果繼續創建並丟棄這些外部線程,這將會累積。你應該努力使用線程池,而不是從外部線程調用,並保持重用之前的線程。

+0

如果在多個線程中調用了'Py_Initialize()',如果一個線程正在讀取此變量'initialized'而另一個線程將其寫入'1',如何保證線程安全? – Allanqunzi

+0

是的,那可能是另一個問題。在這種情況下,你需要在調用''Py_Initialize()''時使用一個互斥鎖。 –