3

UNIXのコードでp_threadsを使用しています。私のメインプログラムには、2つのスレッドを作成するスレッドノードがあり、そのうちの1つはgetl​​ineを使用して標準入力からの読み取りを行っています。このすべてが正常に機能しています。コード中のある時点を除いて、「標準入力から読み取るスレッドを再起動する」必要があります。そして、私がそれをするとき、私はstdinから何も読むことができません。

私が間違っているかもしれないことの提案???/

ありがとう。

これは私がstdinから読んでいる部分です

void* parseCmd(void* s) 
{

    sigset_t new2; 
    struct sigaction act; 
    sigemptyset(&new2); 
    sigaddset(&new2,SIGINT); 
    pthread_sigmask(SIG_UNBLOCK, &new2, NULL); 

    act.sa_handler = interrupt; 
    sigaction(SIGINT, &act, NULL); 
    signal(SIGUSR1, signal_Handler);

    std::string input("");
    while (1) 
    {

       std::cout << "SERVANT > ";
       std::getline(std::cin, input);

       doTheWork(input);
       cin.clear();

       std::cout << std::endl;

      if(global_shutdown==1 || auto_global_shutdown==1)
        break;
    }


    cout<<"cmd thread exit.Main\n"; 
    return 0;

}
4

1 に答える 1

4

おそらく、まだ標準入力に接続されているスレッドを中止しています。getlineの実行中にスレッドを中止したことを忘れないでください。

標準の入力ポインタを取得して解放し、より多くの行を取得できるようにする方法があるかどうかはわかりませんが、前のスレッドが読み取っていた行を読み続ける方法がある可能性があります。

あなたがする必要があるのは:

  • getlineに入るときは、共有フラグを使用してtrueに設定します
  • 静的変数として読み込んだ変数を設定し、再起動が必要なスレッド以外のスレッドでgetlineを使用しないでください
  • 新しいスレッドを再構築するときに、getlineに入るフラグがtrueの場合、getlineを呼び出さないでください
  • 行の取得が終了したら、ブールフラグをリセットします
  • ロックを使用して、読み取り行フラグでの同時アクセスを防止します

値が必要な場合は、getlineに渡すために使用する静的変数を使用するだけです。

于 2011-03-24T19:41:04.120 に答える