我尝试使用两个线程实现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;
}
答案 0 :(得分:5)
这种情况正在发生,因为当您提供输入(std::cin.get()
)并且您没有分离线程或加入它们时,您的程序正在退出。
在Anthony Williams的行动并发中,声明必须在std::thread::join
对象被销毁之前显式调用std::thread::detach
或std::thread
,否则将调用std::terminate
。
因此,崩溃。
您可以通过让int main
等待线程完成执行来修复它:
int main() {
std::thread t2(th_out);
std::thread t1(th_in);
t2.join();
t1.join();
std::cin.get();
return 0;
}
这应该更安全。这也解决了由std::cin
阻止2个线程调用的问题。