c – 我想等待文件描述符和互斥体,推荐的方法是什么?

我想产生线程来执行某些任务,并使用线程安全的队列与它们进行通信.我也想在等待的时候对各种文件描述符做IO.

推荐的方法是什么?当队列从没有元素到某些元素时,是否必须创建一个跨线程管道并写入它?是不是有更好的方法

并且如果我必须创建线程间管道,为什么更多的库实现共享队列允许您创建共享队列和跨线程管道作为单个实体?

我想这样做的事实是否意味着一个基本的设计缺陷?

我问这个关于C和Python.我对跨平台解决方案感兴趣,但主要对Linux感兴趣.

更具体的例子…

我有一些代码将在文件系统树中搜索内容.我有几个通过插座向外界通信的通道.可能(或可能不)导致需要搜索文件系统树中的内容的请求将到达.

我将隔离在一个或多个线程中搜索文件系统树中的东西的代码.我想采取这样的请求,导致需要搜索树,并将它们放在一个线程安全的队列中,以便由搜索者线程完成.结果将被放入完成搜索的队列中.

我希望能够在搜索过程中快速地为所有非搜索请求提供服务.我想能够及时对搜索结果采取行动.

服务传入的请求一般意味着使用epoll的某种事件驱动架构.磁盘搜索请求的队列和结果的返回队列将意味着使用互斥量或信号量来实现线程安全性的线程安全队列.

等待空队列的标准方法是使用条件变量.但是,如果我在等待的时候需要服务其他请求,那将不行.我最终都会一直轮询结果队列(并且将结果延迟一半的轮询间隔,平均),阻塞和不服务请求.

解决方法

每当使用事件驱动架构时,都需要有一个机制来报告事件完成.在Linux上,如果使用文件,则需要使用select或poll系列中的某些内容,这意味着使用管道才能启动所有无文件相关事件.

编辑:Linux有eventfdtimerfd.这些可以添加到你的epoll列表中,用于分别从另一个线程触发或定时器事件触发epoll_wait.

还有另一个选择,那就是信号.可以使用fcntl修改文件描述符,使文件描述符变为活动时发出信号.然后,信号处理程序可以将文件就绪消息推送到您选择的任何类型的队列上.这可能是一个简单的信号量或互斥/ condvar驱动队列.由于现在不再使用select / poll,因此不再需要使用管道来排队基于文件的消息.

健康警告:我没有尝试过,虽然我看不出为什么不起作用,但我并不了解信号方法性能影响.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...