0

Python 用のマルチスレッド C 拡張機能があります。3 つのスレッドを使用して Python のクラスにデータを出力します。

PyGILState_Ensure / PyGILState_Release API を使用してインタープリター呼び出しを同期しています。

拡張機能では、PyGILState_Release を呼び出す前に一部のスレッドがスタックして終了する可能性があります。

その無効な ThreadState を削除して、スレッド API を引き続き使用できる方法はありますか?

ありがとう

4

2 に答える 2

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();

バリアント 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
}
于 2011-03-13T13:29:20.943 に答える
0

スレッドをどのように終了するかは完全にはわかりませんが、私の頭の中にある実装では、スレッド オブジェクトを破棄しているのではないでしょうか? この場合、デストラクタでロックを解除します...

于 2011-03-13T13:07:20.267 に答える