【问题标题】:Send input on std::cin在 std::cin 上发送输入
【发布时间】:2021-06-13 16:49:04
【问题描述】:

我正在运行一个带有主线程和辅助线程的程序,并且在满足某个代码后,两者都应该退出。 问题是辅助线程,在检查运行条件仍然有效后,使用 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 发送一些输入,以便另一个线程将继续执行并退出,而无需任何进一步的用户输入。 提前致谢

【问题讨论】:

  • 这有用吗? non-blocking std::getline, exit if no input详细的解决方案我没看过,不过好像是异步接受输入,线程可以自己结束。
  • 如果这是针对 linux 的,你可以使用信号 API 来解除阻塞,即pthread_kill/sigaction,我在 C 中使用过几次,我想在 C++ 中大致相同。

标签: c++ multithreading cin


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但我想使用独立于平台的解决方案
  • @Mdp11 使用跨平台解决方案编辑。
猜你喜欢
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多