2011-03-20 20 views
3

我將Python 3.2嵌入到C++應用程序中,並且我有幾個在程序中不同時間運行的子解釋器(由Py_NewInterpreter創建)。他們在不同的時間獲取和釋放GIL,但是當我想摧毀一個子解釋器時,我遇到了一個問題。摧毀一個子解釋器後釋放GIL

要銷燬一個子解釋器,你必須獲得GIL。所以我這樣做:

PyEval_AcquireLock(threadstate); 

然後,我毀滅與

Py_EndInterpreter(threadstate); 

解釋你認爲這將釋放GIL因爲保存它被摧毀的東西。然而,對於Py_EndInterpreter的文件說:

給定的線程狀態必須是 當前線程的狀態。請參閱下面的線程狀態的 討論。 當通話返回時,當前的 線程狀態爲NULL。 (全局解釋鎖必須調用此函數之前舉行,當它返回時保持靜止。)

所以,如果我必須保持GIL當我摧毀一個子解釋和銷燬子解釋器將其設置爲NULL而且我必須擁有獲取GIL的線程才能釋放它,在銷燬子翻譯器之後如何釋放GIL?

回答

2

如果您在致電Py_EndInterpreter()後直接致電PyEval_ReleaseLock(),會發生什麼情況?這就是文檔告訴你無論如何要做的事情。 :)