1

本当に奇妙な問題に遭遇しました。私のコードでは、ユーザーがメイン プロセスを中断したい場合に備えて、ユーザー入力を待機するスレッドを 1 つ起動しています。そのスレッドが実行された後、python を使用していくつかの計算を実行しようとします。スレッドはgetchar()-- を使用してユーザー入力を探します。入力がリターンの場合、ブール値フラグが設定され、メイン プロセスの実行を停止します。メイン プロセスはこのフラグをときどきチェックし、設定されている場合は適切なアクションを実行します。

概略的に:

bool volatile stopper = false;
thread stopThread(interrupt, &stopper);
while( !stopper ) {
    /* ... stuff ... */
    Py_Initialize();                            // this doesn't return unless 'interrupt()' completes.
    /* ... do things with python object ... */
} 

割り込みメソッドは次のようになります。

void interrupt(bool *st) {
    char ch;   
    while( ch != '\n' ) {
        ch = getchar();
    }
    *st = true;
}

getchar()while ループをに置き換えると、正常にsleep(10)返さPy_Initialize()れ、すべてがうまく機能します。IO リクエストがブロックされるのはなぜPy_Initialize()ですか?

ありがとう!

4

1 に答える 1

1

のようなI/O関数を呼び出すとgetchar、関数が終了するまでI/Oオブジェクトのロックを保持します。マルチスレッドプログラムでロックを無期限に保持すると、そのロックを取得しようとするスレッドが無期限にブロックされるため、非常に悪い形式です。マルチスレッドプログラムでブロッキングI/O関数を呼び出さないでください。

于 2012-12-23T00:41:51.373 に答える