推荐的方法是什么?当队列从没有元素到某些元素时,是否必须创建一个跨线程管道并写入它?是不是有更好的方法?
并且如果我必须创建线程间管道,为什么更多的库实现共享队列允许您创建共享队列和跨线程管道作为单个实体?
我想这样做的事实是否意味着一个基本的设计缺陷?
我问这个关于C和Python.我对跨平台解决方案感兴趣,但主要对Linux感兴趣.
更具体的例子…
我有一些代码将在文件系统树中搜索内容.我有几个通过插座向外界通信的通道.可能(或可能不)导致需要搜索文件系统树中的内容的请求将到达.
我将隔离在一个或多个线程中搜索文件系统树中的东西的代码.我想采取这样的请求,导致需要搜索树,并将它们放在一个线程安全的队列中,以便由搜索者线程完成.结果将被放入完成搜索的队列中.
我希望能够在搜索过程中快速地为所有非搜索请求提供服务.我想能够及时对搜索结果采取行动.
服务传入的请求一般意味着使用epoll的某种事件驱动架构.磁盘搜索请求的队列和结果的返回队列将意味着使用互斥量或信号量来实现线程安全性的线程安全队列.
等待空队列的标准方法是使用条件变量.但是,如果我在等待的时候需要服务其他请求,那将不行.我最终都会一直轮询结果队列(并且将结果延迟一半的轮询间隔,平均),阻塞和不服务请求.
解决方法
编辑:Linux有eventfd和timerfd.这些可以添加到你的epoll列表中,用于分别从另一个线程触发或定时器事件触发epoll_wait.
还有另一个选择,那就是信号.可以使用fcntl修改文件描述符,使文件描述符变为活动时发出信号.然后,信号处理程序可以将文件就绪消息推送到您选择的任何类型的队列上.这可能是一个简单的信号量或互斥/ condvar驱动队列.由于现在不再使用select / poll,因此不再需要使用管道来排队基于文件的消息.