如何以独立于平台的方式终止阻塞IO的线程?

时间:2012-02-06 15:59:57

标签: c++ multithreading c++11

由于std C ++不支持非阻塞控制台IO,因此我尝试在单独的线程上执行控制台输入。我仍然有从外部终止线程的问题。 没有Unix信号怎么办呢?

如果我使用select(),它可以发出信号,如果某个东西在输入缓冲区中,但如果它不是整行(包含换行符),那么“cin<< myvar”仍然会阻塞,我无法测试我的停止标志介于两者之间。

任何符合C ++ 11标准的解决方案都让我感兴趣。

3 个答案:

答案 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>>"来完成。操作