由于非阻塞控制台IO在标准C++中不受支持,因此我尝试在单独的线程上执行控制台输入。然而,我仍然有从外部终止线程的问题。没有Unix信号,我怎么做?
如果我使用select(),它可以通知输入缓冲区中是否有什么东西,但是如果它不是整行(包含换行符),那么"cin << myvar“仍然会阻塞,并且我不能在其间测试我的停止标志。
我对任何符合C++11的解决方案都感兴趣。
发布于 2012-02-06 16:32:53
一般来说,你不能。在Posix下,您可以将线程设置为捕获特定的信号,并使用pthread_kill()
;从信号处理程序返回后,系统级的阻塞IO (即read()
)将返回errno
等于EINTR
。除此之外,您在很大程度上受制于iostream实现,它有两个选择( iostream的实现者,而不是您):
在第一种情况下,除了实现您自己的streambuf
并使用它(对于控制台输入来说,这并不像看起来那么困难)之外,您对此无能为力。对于第二种情况,您应该在读取前将errno
设置为0,并在读取失败后进行检查(在iostream级别);如果是EINTR
,则可以采取适当的操作,如果您打算重用流,则不要忘记重置错误(std::ios_base::clear()
)。
发布于 2012-02-06 16:03:59
您可以使用cin.get()
和select
来读取单个字符,以避免阻塞线程。此外,cin.rdbuf()->in_avail()
还返回缓冲区中可用字符的数量。
发布于 2012-02-06 16:20:22
根据我的浅显经验,我从未见过一种稳定的方法来取消同步和/或阻塞I/O操作。也就是说,它不能用"cin >>“操作符来完成。
https://stackoverflow.com/questions/9162998
复制相似问题