由于std C ++不支持非阻塞控制台IO,因此我尝试在单独的线程上执行控制台输入。我仍然有从外部终止线程的问题。 没有Unix信号怎么办呢?
如果我使用select(),它可以发出信号,如果某个东西在输入缓冲区中,但如果它不是整行(包含换行符),那么“cin<< myvar”仍然会阻塞,我无法测试我的停止标志介于两者之间。
任何符合C ++ 11标准的解决方案都让我感兴趣。
答案 0 :(得分:4)
你不能一般。在Posix下,您可以设置线程以捕获a
特定信号,并使用pthread_kill()
;从...返回后
信号处理程序,阻止系统级别的IO(即read()
)将
返回时errno
等于EINTR
。除此之外,你几乎就是这样
iostream实现的优点,它有两个选择(
iostream的实现者,不是你):
它可以循环返回并重试tge read,或
它可以将其视为错误条件,并设置failbit
。
在第一种情况下,你可以做的事情不多,缺少
实现自己的streambuf
并使用它(对于控制台来说)
输入,并不像看起来那么困难)。对于第二个,你应该设置
读取前errno
为0,读取失败后检查(在
iostream级别);如果是EINTR
,您可以采取适当的行动,
如果你,不要忘记重置错误(std::ios_base::clear()
)
打算重用流。
答案 1 :(得分:1)
您可以使用cin.get()
来阅读单个字符,并组合使用select
以避免阻塞该帖子。另外cin.rdbuf()->in_avail()
返回缓冲区中就绪字符的数量。
答案 2 :(得分:0)
在我的卑微经历中,从未见过一种取消同步和/或阻塞I / O操作的稳定方法。也就是说,它不能用" cin>>"来完成。操作