3

私のプログラムには、ユーザーからコマンド入力を受け取るメイン スレッドがあります。これとは別に、バックグラウンドでデータを大量に処理するワーカー スレッドが複数 (少なくとも 1 つ) 存在する可能性があります。

ユーザーは、コンソールに入力するコマンドを使用してプログラムを終了できます。ただし、データ チャーニングが完了すると、メイン スレッドはユーザー入力を待ってまだブロックされているため、プログラムは終了しません。

私が知りたいのは、終了コマンド「q\n」をstd::cinワーカースレッドから書き込んで、ブロックしているコマンド入力スレッド (メインスレッドも) が終了するようにする方法です。それとも、これは悪いことでしょうか? 以下を試してみましたが、プログラムが単にハングするか、に書き込むことができstd::cinません。理由はわかりません。

static ACE_THR_FUNC_RETURN worker( void *p) {
 .....
    if (_this->m_num_threads_done == _this->m_threads.size()) {
        fputs("q\n", stdin);
    }

}

メイン スレッドでは、これは main から呼び出されます。

void runEventLoop()
{
    printWelcomeMessage();

    char buffer[MAXC];
    while( !m_exitLoop )
    {
        std::cin.getline(buffer, MAXC);
        if( std::cin.eof() )
            break;
        handleCommand( buffer );
    }
}

ここで私が間違っていることについて誰かがアドバイスしてくれますか、それとも私が達成しようとしていることに対するより良い解決策を提案してくれますか?

ありがとう

4

2 に答える 2

3

Unix では、複数のことを待機するスレッドが必要な場合 (たとえば、std::in の文字と、シャットダウン中であることを伝えるワーカー スレッドからのコマンド) を使用すると、select()... を作成できます。 pipe() システムコールを含むパイプと、ワーカースレッドが終了時にパイプに書き込むことができます...現在cinで待機しているメインスレッドは、両方でselect()を呼び出してブロックし、起動されたときにどちらかに適切に反応することができます上..

Windows では、おそらく WaitForMultipleObjects() を同じ目的で使用できます。

于 2010-01-15T15:07:37.723 に答える
2

「優れた」解決策は、独自の入力関数を作成することです。これは、非ブロッキングであり、文字が押されているかどうかをチェックし、そうでない場合はアイドル状態です。そのループでは、終了チェックを行うことができます。

ノンブロッキングキーボード入力についてお読みください。

それとは別に、スレッドライブラリとオペレーティングシステムに応じて、プラットフォームに依存するソリューションがいくつかあります。その情報で質問を拡大していただければ、何か提案することができます。

于 2010-01-15T15:02:31.870 に答える