首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux:应用程序响应性和select()

Linux:应用程序响应性和select()
EN

Stack Overflow用户
提问于 2012-10-07 19:22:50
回答 3查看 168关注 0票数 1

我有一个使用open() [O_RDWR | O_NONBLOCK]write()select()read()close()来处理设备文件的C++控制台应用程序。也可以调用ioctl()来取消当前操作。在任何给定时间,只有一个用户可以使用设备工作。

我需要想出一个具有libsigc++信号的C++类,当设备上的数据可用时,这些信号就会触发。

问题:当调用select()时,应用程序在等待数据时变得没有响应。如何让它响应--通过在工作线程中调用select()?如果是这样的话-工作线程如何与主线程通信?也许我应该调查一下boost::asio

EN

回答 3

Stack Overflow用户

发布于 2012-10-07 19:54:13

选择如何使其响应-通过在工作线程中调用

()

您可以使用dup(),这将复制您的文件描述符...因此,您可以将整个读取操作移动到另一个线程中。因此,您的写入线程和处理线程将会响应,即使读取select()线程处于休眠状态。

libsigc++的信号发送开销很小,因此我认为您可以将代码嵌入到读线程本身中。插槽可以存在于不同的线程中,这是你接收信号的地方……

尽管thrift不使用libsigc++,但我认为完全基于boost的Thrift源代码可能会引起您的兴趣。

票数 0
EN

Stack Overflow用户

发布于 2013-05-21 04:13:54

听起来您好像误解了select;select (或poll、epoll等)的目的不是“等待数据”,而是“等待一系列文件描述符或计时器上发生的一个或多个事件,或要引发的信号”。

在您的select调用中,缺少了什么“响应性”?您说它是一个控制台应用程序,所以您不是在谈论GUI循环,所以它可能与IO相关?如果是这样,那么您需要重构select,使等待您所讨论的数据成为一个元素;也就是说,如果您使用select,则构建您想要等待输入的所有文件/套接字描述符(以及标准输入和标准输出是文件描述符)的FD_SETs。

或者构建一个循环,对任何挂起的输入定期调用" select“,并对/test/进行短暂的超时,并且仅在select告诉您有要读取的内容时才尝试读取它。

票数 0
EN

Stack Overflow用户

发布于 2013-05-22 04:16:44

听起来你有一个producer-consumer风格的问题。有各种方法可以实现这个问题的解决方案,但现在大多数人倾向于使用基于condition variable的方法(请参阅此C++11 based example)。

还有许多设计模式在实现时可以帮助缓解并发问题,例如:

Half-Sync / Half-Async

  • 一种生产者-消费者风格的模式,它在使用事件填充队列的异步层和处理这些事件的同步层之间引入队列。

Leader / Followers

here.提供了

  • 多线程轮流处理事件
  • 的相关讨论
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12768382

复制
相关文章

相似问题

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