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 回答