【问题标题】:C file descriptor, Poll and threadC 文件描述符、轮询和线程
【发布时间】:2016-01-28 18:56:15
【问题描述】:

假设我有几个要监控的套接字。如果我在每个文件描述符上创建 POSIX 文件描述符并为每个文件描述符结构分配一个事件处理程序,我是否需要为每个套接字创建和分配线程?

我的理解是,每当定义的文件描述符上发生事件时,都会调用其事件处理函数。所以不需要线程。我对吗?

【问题讨论】:

  • 我的理解是线程从来不是必需的。有时它们可​​以提高性能(并行计算),有时它们使生活变得更轻松,但更难(除非使用得当)。线程绝对不是必需来处理多个套接字,但根据应用程序可能是一个不错的设计选择。并请详细说明“事件处理程序”。如果没有上下文,这是一个过于宽泛的术语。事实上,事件处理程序只是一个回调子程序。
  • “为每个文件描述符结构分配一个事件处理程序”是什么意思?在 POSIX 中没有分配事件处理程序的方法。每个套接字创建一个线程只是同时监视多个套接字的方法之一。通常,这是最简单的调试方法,但它不适用于大量套接字。其他选项包括: 1)使用非阻塞套接字的单线程,循环检查所有套接字; 2) 使用带有非阻塞套接字和select/poll/epoll 系统调用的单线程。
  • 谢谢。我为每个文件描述符创建了一个结构,该结构存储了指向处理函数的指针。当然不是标准的,在 POSIX 中。

标签: c linux sockets posix


【解决方案1】:

您的问题“我需要为每个套接字创建和分配线程吗?”的简单答案?没有”。线程是在脚下射击自己的完美方式。

但是看这部分:"[...] 每当一个事件发生在一个定义的文件描述符上,它的事件处理函数就会被调用[...]"。现在回答问题:将调用事件处理程序? 如何您的程序会注意到某个事件的发生?

当然,您可以为每个描述符创建每个线程,然后“坐”在它们上面,例如阻塞读取功能。然后在试图与你的主线程同步时死于可怕的死亡。

但更好的解决方案是让您的主循环步骤之一检查事件(例如使用selectpoll 函数),然后,对于每个“活动”的描述符" 从主循环调用它的处理程序。如果处理程序中的处理不耗时,您可以与线程保持安全距离。

【讨论】:

  • “检查事件”是的,但使用pollppoll,它们比select 更现代且更易于使用。
  • @BenVoigt:谢谢。我已经更新了我的答案。但我习惯使用select ;)
  • 谢谢。我实际上使用了投票。但这是我第一次使用它,并不确定它实际上是如何运作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2016-02-05
  • 2021-07-30
相关资源
最近更新 更多