是否可以为std :: cin设置超时?
例如,std :: cin在10秒内没有收到任何数据 – 它会抛出异常或返回错误.
编辑:
那么来自Boost库的计时器呢?据我所知,它是便携式库.是否有可能要求Boost库的计时器在预定义的时间段后抛出异常?我想它可以解决这个问题.
解决方法:
无法以便携方式为std :: cin设置超时.即使采用非便携式技术,这样做也并非完全无关紧要:您需要替换std :: cin的流缓冲区.
在UNIX系统上,我将使用自定义文件描述符来替换std :: cin使用的默认流缓冲区,该文件描述符使用文件描述符0来读取输入.要实际读取输入,我将使用poll()来检测输入的存在并在此函数上设置超时.根据poll()的结果,我会读取可用的输入或失败.为了可能处理未转发到文件描述符的类型字符,但是,在输入换行符之前也可以关闭缓冲.
使用多个线程时,您可以创建一个可移植的过滤流缓冲区,它使用线程来读取实际数据,另一个线程使用一个定时条件变量,等待第一个线程发出信号表明它接收到数据或者超时到期.请注意,您需要防止虚假唤醒以确保在没有输入时确实达到了超时.这样可以避免不得不修改从std :: cin读取数据的实际方式,尽管它仍然替换了std :: cin使用的流缓冲区,以使该功能可通过此名称访问.