2011-12-12 80 views
8

真正的多線程我想測試一個多線程的C++ DLL。這個DLL應該是線程安全的。我用boost.python包裝了它,我想創建多個python線程來通過boost.python包裝器來運行DLL。我實際上是嘗試導致線程問題。並帶有Boost.Python

我似乎無法找到很好的文檔是python解釋器是否會支持它的兩個線程(在不同的核心上說)同時調用導入的模塊,以及GIL是否需要管理我不希望任何額外的安全性高於DLL應該提供的。

誰能描述或參考我的蟒蛇調用多個線程和GIL是如何suppsed在這種情況下要使用的DLL模塊的描述?

+0

顯然,你將不得不自己來釋放GIL,否則你不會有任何一個以上的線程同時運行。見http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

這是http://stackoverflow.com/questions/8009613/的副本? –

+0

一個問題:如果我不釋放GIL,並且從Python調用的C++代碼創建一個線程,該線程是否可以安全地調用python代碼。我想不是因爲它會解釋我得到的崩潰... – MatthieuW

回答

1

答案是否定的,GIL將永遠不會真正的多線程,除非DLL手動解除鎖定。 Python允許一次只運行一個線程,除非擴展名手動指出:「我被阻止,沒有我就繼續運行」。這通常是在Python的include/ceval.h中定義的Py_BEGIN_ALLOW_THREADS宏(並且用Py_END_ALLOW_THREADS撤消)完成的。一旦擴展完成,python將允許另一個線程運行,並且執行任何python的第一個線程可能會導致問題(如評論問題所述)。它確實意味着阻止I/O或進入繁重的計算時間。