一尘不染

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

linux

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

推荐什么方法来做到这一点?当队列从无元素到某些元素时,是否必须创建一个线程间管道并对其进行写入?有没有更好的方法?

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

我要这样做的事实是否真的暗示了基本的设计缺陷?

我在问有关C ++和Python的问题。我对跨平台解决方案感兴趣,但主要对Linux感兴趣。

举一个更具体的例子…

我有一些代码将在文件系统树中搜索内容。我有几个通过套接字向外界开放的通信渠道。可能会(或可能不会)导致需要搜索文件系统树中内容的请求将到达。

我将隔离在一个或多个线程中搜索文件系统树中内容的代码。我想接受导致需要搜索树的请求,并将其放入由搜索器线程完成的线程安全队列中。结果将放入已完成搜索的队列中。

我希望能够在进行搜索时快速处理所有非搜索请求。我希望能够及时对搜索结果采取行动。

服务传入的请求通常意味着使用某种事件驱动的体系结构epoll。磁盘搜索请求队列和结果返回队列将暗示一个线程安全队列,该队列使用互斥量或信号量来实现线程安全。

等待空队列的标准方法是使用条件变量。但是,如果我在等待时需要处理其他请求,那将行不通。我要么总是一直轮询结果队列(并且平均将结果延迟轮询间隔的一半),要么阻塞请求,要么不为请求提供服务。


阅读 302

收藏
2020-06-07

共1个答案

一尘不染

每当使用事件驱动的体系结构时,都需要使用一种机制来报告事件完成。在Linux上,如果一个人正在使用文件,则需要使用select或poll系列中的某个东西,这意味着一个人只能使用管道来启动所有与文件无关的事件。

编辑 :Linux有eventfdtimerfd。可以将它们添加到您的epoll列表中,并epoll_wait分别从另一个线程触发或在计时器事件上触发。

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

健康警告:我没有尝试过,尽管我看不出为什么它不起作用,但我真的不知道该signal方法的性能含义。

编辑:在信号处理程序中操作互斥锁可能是一个非常糟糕的主意。

2020-06-07