2014-09-30 133 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对象之前保留它。没有锁定,即使是最简单的操作也可能导致多线程程序出现问题:例如,当两个线程同时递增同一对象的引用计数时,引用计数可能最终只会增加一次而不是两次。

相关问题