首页 > 解决方案 > 在 std::cin 上发送输入

问题描述

我正在运行一个带有主线程和辅助线程的程序,并且在满足某个代码后,两者都应该退出。问题是辅助线程,在检查运行条件仍然有效后,使用 std::cin 等待用户输入,因此如果在调用 std::cin 之后满足条件,则线程继续等待用户输入。代码是这样的:

MainThread()
{
    std::thread t1{DoOtherWork}
    ...
    while(condition)
    {
         DoWork();
    }

    t1.join();
}

DoOtherWork()
{
    while(condition)
    {
         char c;
         std::cin >> c;
         ProcessInput(c);
    }

    return;
}

因此,当不再满足条件时,两者都应该退出,但程序会一直等待用户输入。如果我只是输入任何随机字符并按回车键,程序就会正常退出。

我的问题是,在加入辅助线程之前,是否有任何方法可以从主线程向 std::cin 发送一些输入,以便另一个线程将继续执行并退出,而无需任何进一步的用户输入。提前致谢

标签: c++multithreadingcin

解决方案


这是一个跨平台的解决方案:

诀窍是创建第三个线程,其唯一的工作就是接收输入。一旦处理,输入就会被记录下来。第二个线程可以使用互斥体以任何所需的时间间隔异步访问这些记录。这消除了线程的阻塞性质,std::cin并允许您随时终止线程。

在 Windows 上,您可以CreateThread使用std::thread. 它返回一个句柄,您可以使用该句柄TerminateThread在任何时候终止给定线程。


推荐阅读