微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

更具体的例子…

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

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

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

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

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

解决方法

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

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

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

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

原文地址:https://www.jb51.cc/c/114806.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐