2

2 つのスレッドで実装しようとしましたcondition_variable。ユーザー入力 ( ) を使用しない場合、次のコードはうまく機能しますstd::cinが、一度使用すると、画面に数字を入力した後にプログラムがクラッシュしました。

なぜクラッシュするのですか?

std::mutex mu;
std::condition_variable cond;
int x =0;
void th_in()
{
  std::unique_lock <mutex> locker(mu);
  std::cin>>x;
  locker.unlock();
  cond.notify_all();
}
void th_out()
{
  std::unique_lock <mutex> locker(mu);
  cond.wait(locker);
  std::cout<<x<<std::endl;
  locker.unlock();
}

int main()
{    
  std::thread t2(th_out);
  std::thread t1(th_in);    
  std::cin.get();
  return 0;
}
4

1 に答える 1

5

これは、入力 ( ) を与えるとプログラムが終了しstd::cin.get()、スレッドを切り離したり結合したりしていないために発生します。

Anthony WilliamsによるConcurrency in Actionでは、オブジェクトが破棄される前に明示的にorを呼び出す必要があり、それ以外の場合は呼び出されると述べられています。std::thread::joinstd::thread::detachstd::threadstd::terminate

したがって、クラッシュ。


int mainスレッドの実行が完了するまで待機することで修正できます。

int main() {
    std::thread t2(th_out);
    std::thread t1(th_in);

    t2.join();
    t1.join();

    std::cin.get();
    return 0;
}

これはより安全なはずです。これにより、 によって 2 つのスレッドがブロックされることによって引き起こされる問題も解決されstd::cinます。

于 2013-07-18T21:49:41.077 に答える