我有一个Python的多线程C扩展。它使用3个线程在Python中将数据输出到类中。
我正在使用PyGILState_Ensure / PyGILState_Release API来同步解释器调用。
扩展中可能存在某些线程在调用PyGILState_Release之前卡住并终止的情况。
无论如何我可以删除无效的ThreadState并继续使用线程API吗?
由于
答案 0 :(得分:0)
我不完全确定你是如何终止你的线程的,但是在我脑子里的实现中,你会破坏一个线程对象吗?在这种情况下,您将在析构函数中释放锁定...
答案 1 :(得分:0)
我建议改变线程之间的交互模式。
您当前的实施似乎是这样的:
PyGILState_Ensure();
result = doDangerousThing(); // this could kill the thread
storeToPythonObject(result);
PyGILState_Release();
变体A,显而易见:
result = doDangerousThing(); // this could kill the thread
PyGILState_Ensure();
storeToPythonObject(result);
PyGILState_Release();
/* 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
}