2014-09-30 130 views
2

我有兩個函數同時在兩個線程上運行。這兩個函數都調用這個方法PyObject_CallObject(pFunc,pArgs) 來執行兩個不同的python函數。但當我嘗試這樣做時,我得到了access violation reading location異常。在兩個函數中使用的pFuncpArgs都是本地函數,並且沒有共享數據。還是我如何得到異常?如何同時在兩個不同的線程中執行PyObject_CallObject()?

回答

2

這是不可能的。您需要在調用任何Python CAPI函數之前獲取全局解釋器鎖(GIL)。只有幾個函數可以在沒有GIL的情況下調用。

https://docs.python.org/2/c-api/init.html#thread-state-and-the-global-interpreter-lock

Python解釋器不是完全線程安全的。爲了支持多線程的Python程序,有一個全局鎖,稱爲全局解釋器鎖或GIL,必須在當前線程可以安全地訪問Python對象之前保留它。沒有鎖定,即使是最簡單的操作也可能導致多線程程序出現問題:例如,當兩個線程同時遞增同一對象的引用計數時,引用計數可能最終只會增加一次而不是兩次。

相關問題