【发布时间】:2015-02-26 22:13:55
【问题描述】:
我的程序有许多不同的线程处理不同的事情,其中一个处理用户输入。
其他线程没有太多阻塞调用的方式,那些阻塞调用是基于网络的,所以当套接字关闭时会被中断或优雅地返回。
但是,用户线程调用std::cin 以获取用户输入。这样做的效果是,当所有其他线程都死掉时,用户线程仍然阻塞用户输入,并且只会在下一次输入时死掉。
有什么方法可以让我在阻塞之前检查是否有任何用户输入要抓取?
我知道cin.peek() 存在,但根据我的经验,如果没有可读取的内容,它会阻塞。假设我使用正确
我的代码基本上是一个无限循环,当另一个线程切换条件变量时会停止:
void doLoop()
{
while (running) //running is shared between all threads and all others die quickly when it is false. It's set to true before the threads are started
{
string input = "";
getline(cin, input);
//Handle Input
}
}
我在 windows 上,使用 VS2013,不能使用外部库。我一直在使用 windows.h 和 std。
【问题讨论】:
-
应该提到,我在windows上
-
当程序停止运行时,你能直接杀死用户输入线程吗?
-
怎么杀?我将线程创建为 std::thread,并且认为没有办法远程杀死它们。我宁愿不追求这个,但主线程终止会安全地杀死剩余的线程吗?
-
@ForceGaia 这对我来说很清楚,但由于所有这些东西实际上都是依赖于操作系统的,所以你应该这样标记。
std::thread选项可能仍会为您提供一些可行的解决方案。
标签: c++ multithreading windows-8.1 user-input blocking