2014-09-30 4 views
2

두 개의 스레드에서 동시에 실행되는 두 개의 함수가 있습니다. 두 함수 모두이 메서드를 PyObject_CallObject(pFunc,pArgs) 이라고 부르며 두 개의 다른 파이썬 함수를 실행합니다. 하지만 그렇게하려고하면 access violation reading location 예외가 발생합니다. 두 기능 모두에 사용 된 pFuncpArgs은 해당 기능에 대해 로컬이며 공유 된 데이터가 없습니다. 아직도 나는 예외를 얻는가?두 개의 다른 스레드에서 PyObject_CallObject()를 동시에 실행하는 방법은 무엇입니까?

답변

2

그건 불가능합니다. 은 파이썬 CAPI 함수를 호출하기 전에 전역 인터프리터 잠금 (GIL)을 획득해야합니다. GIL없이 호출 할 수있는 몇 가지 기능 만 있습니다.

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

파이썬 인터프리터는 스레드에 안전하지 않습니다. 멀티 쓰레드 파이썬 프로그램을 지원하기 위해서 파이썬 객체에 안전하게 접근하기 전에 현재 쓰레드에 의해 유지되어야하는 전역 인터프리터 잠금 또는 GIL이라고하는 전역 잠금이 있습니다. 잠금이 없으면 가장 단순한 작업조차도 멀티 스레드 프로그램에서 문제를 일으킬 수 있습니다. 예를 들어 두 스레드가 동시에 동일한 오브젝트의 참조 횟수를 증가 시키면 참조 횟수가 두 번 증가하는 대신 한 번만 증가 할 수 있습니다.

관련 문제