2011-03-12 7 views
0

파이썬 용 다중 스레드 C 확장이 있습니다. 3 개의 쓰레드를 사용하여 파이썬에서 클래스에 데이터를 출력합니다.파이썬 다중 스레드 확장 - 스레드 잠금 복구

저는 PyGILState_Ensure/PyGILState_Release API를 사용하여 인터프리터 호출을 동기화합니다.

PyGILState_Release를 호출하기 전에 일부 스레드가 멈추거나 종료되는 경우가 있습니다.

어쨌든 잘못된 ThreadState를 제거하고 스레딩 API를 계속 사용할 수 있습니까?

감사

답변

0

나는 당신이 당신의 스레드를 종료하는 방법을 완전히 잘 모르겠지만, 나는 내 머리에이 구현에, 당신은 당신이하지 스레드 객체를 것이다 파괴한다 있을까? 이 경우 소멸자에서 잠금을 해제하면 ...

0

스레드 간의 상호 작용 패턴을 변경하는 것이 좋습니다.

현재 구현은 다음과 같이 작동하는 것 같다 :

PyGILState_Ensure(); 
result = doDangerousThing(); // this could kill the thread 
storeToPythonObject(result); 
PyGILState_Release(); 

변형을, 명백한 :

result = doDangerousThing(); // this could kill the thread 
PyGILState_Ensure(); 
storeToPythonObject(result); 
PyGILState_Release(); 

변형 B는 덜 분명, 아이디어를 [1], [2]를 참조하십시오

/* worker_thread.c */ 
result = doDangerousThing(); // this could kill the thread 
putToLocklessQueue(result, *queue_in_main_thread); 

/* main_thread.c */ 
if (hasItems(my_lockless_queue)) { 
    PyGILState_Ensure(); 
    while (hasItems(my_lockless_queue)) { 
    storeToPythonObject(popItem(my_lockless_queue)); 
    } 
    PyGILState_Release(); 
    // sleep again here 
}