首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以平台无关的方式终止阻塞IO挂起的线程?

如何以平台无关的方式终止阻塞IO挂起的线程?
EN

Stack Overflow用户
提问于 2012-02-06 23:59:57
回答 3查看 2.2K关注 0票数 2

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

如果我使用select(),它可以通知输入缓冲区中是否有什么东西,但是如果它不是整行(包含换行符),那么"cin << myvar“仍然会阻塞,并且我不能在其间测试我的停止标志。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-07 00:32:53

一般来说,你不能。在Posix下,您可以将线程设置为捕获特定的信号,并使用pthread_kill();从信号处理程序返回后,系统级的阻塞IO (即read())将返回errno等于EINTR。除此之外,您在很大程度上受制于iostream实现,它有两个选择( iostream的实现者,而不是您):

  • it可以循环返回并重试读取,或者
  • 可以将其视为错误条件,并将其设置为

在第一种情况下,除了实现您自己的streambuf并使用它(对于控制台输入来说,这并不像看起来那么困难)之外,您对此无能为力。对于第二种情况,您应该在读取前将errno设置为0,并在读取失败后进行检查(在iostream级别);如果是EINTR,则可以采取适当的操作,如果您打算重用流,则不要忘记重置错误(std::ios_base::clear())。

票数 4
EN

Stack Overflow用户

发布于 2012-02-07 00:03:59

您可以使用cin.get()select来读取单个字符,以避免阻塞线程。此外,cin.rdbuf()->in_avail()还返回缓冲区中可用字符的数量。

票数 1
EN

Stack Overflow用户

发布于 2012-02-07 00:20:22

根据我的浅显经验,我从未见过一种稳定的方法来取消同步和/或阻塞I/O操作。也就是说,它不能用"cin >>“操作符来完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9162998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档