Python多线程扩展-线程锁恢复

Python多线程扩展-线程锁恢复,python,python-multithreading,Python,Python Multithreading,我有一个用于Python的多线程C扩展。它使用3个线程向Python中的类输出数据 我正在使用PyGILState\u sure/PyGILState\u发布API来同步解释器调用 在扩展中,有些线程可能会在调用PyGILState_Release之前卡住并终止 我是否可以删除无效的线程状态并继续使用线程API 谢谢我不完全确定如何终止线程,但在我脑海中的实现中,您将破坏一个线程对象,不是吗?在这种情况下,释放析构函数中的锁…我建议更改线程之间的交互模式 您当前的实现似乎是这样工作的: PyGI

我有一个用于Python的多线程C扩展。它使用3个线程向Python中的类输出数据

我正在使用PyGILState\u sure/PyGILState\u发布API来同步解释器调用

在扩展中,有些线程可能会在调用PyGILState_Release之前卡住并终止

我是否可以删除无效的线程状态并继续使用线程API


谢谢

我不完全确定如何终止线程,但在我脑海中的实现中,您将破坏一个线程对象,不是吗?在这种情况下,释放析构函数中的锁…

我建议更改线程之间的交互模式

您当前的实现似乎是这样工作的:

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();
变体B,不太明显,请参见,了解想法:

/* 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
}