当前位置: 首页 > 面试题库 >

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

唐弘和
2023-03-14
问题内容

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

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

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

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

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

举一个更具体的例子…

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

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

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

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • Python 中,通过使用描述符,可以让程序员在引用一个对象属性时自定义要完成的工作。 本质上看,描述符就是一个类,只不过它定义了另一个类中属性的访问方式。换句话说,一个类可以将属性管理全权委托给描述符类。 描述符是 Python 中复杂属性访问的基础,它在内部被用于实现 property、方法、类方法、静态方法和 super 类型。 描述符类基于以下 3 个特殊方法,换句话说,这 3 个方法组成

  • 问题内容: 我想知道Node.js中的数据访问是否需要互斥锁/锁。例如,假设我已经创建了一个简单的服务器。服务器提供了几种协议方法,可以添加到内部阵列中或从内部阵列中删除。我需要使用某种互斥量保护内部阵列吗? 我了解Javascript(因此Node.js)是单线程的。我只是不清楚事件的处理方式。事件会中断吗?如果真是这样,我的应用程序可能正在读取数组的过程中,被打断以运行事件回调以更改数组,然后

  • 问题内容: 使用posix的read()write()linux调用,可以确保如果我以串行方式通过一个文件描述符进行写入并通过另一个文件描述符进行读取,以使两个动作彼此互斥…读取文件描述符将始终看到写入文件描述符最后写入的内容? 我相信是这种情况,但我想确定一下,手册页对此没有太大帮助 问题答案: 这取决于您在哪里获得了两个文件描述符。如果它们来自dup(2)调用,则它们共享文件的偏移量和状态,因

  • 文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作

  • 文件描述符接口 函数 int  fd_new (void)   分配文件描述符   struct dfs_fd *  fd_get (int fd)   获取文件描述结构   void  fd_put (struct dfs_fd *fd)   放置文件描述符   int  fd_is_open (const char *pathname)   判断文件是否已被打开   int  select (

  • 问题内容: 我正在学习Java多线程编程。我有以下逻辑: 假设我有A班 现在,我不需要同步“ someMethod1”或“ someMethod2”中的操作。这意味着,如果有两个线程同时调用“ someMethod1”,则无需序列化这些操作(因为ConcurrentMap将完成此工作)。 但是我希望“ someMethod1”和“ someMethod2”彼此互斥,这意味着当某个线程正在执行“ s