C文件描述符、轮询和线程

C文件描述符、轮询和线程,c,linux,sockets,posix,C,Linux,Sockets,Posix,假设我有几个插座要监视。如果我在每个套接字上创建POSIX文件描述符,并为每个文件描述符结构分配一个事件处理程序,那么我是否需要为每个套接字创建并分配线程 我的理解是,只要定义的文件描述符上发生事件,就会调用其事件处理程序函数。因此不需要线程。我说得对吗 对于您的问题“是否需要为每个套接字创建并分配线程?”的简单答案是“否”。线是射中自己脚的完美方式 但请看这一部分:“[…]每当定义的文件描述符上发生事件时,其事件处理程序函数将被调用[…]”。现在回答以下问题:谁将调用事件处理程序您的程序将如何

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


我的理解是,只要定义的文件描述符上发生事件,就会调用其事件处理程序函数。因此不需要线程。我说得对吗

对于您的问题“是否需要为每个套接字创建并分配线程?”的简单答案是“否”。线是射中自己脚的完美方式

但请看这一部分:“[…]每当定义的文件描述符上发生事件时,其事件处理程序函数将被调用[…]”。现在回答以下问题:谁将调用事件处理程序您的程序将如何注意到事件发生

当然,您可以为每个描述符创建每个线程,并使用例如阻塞读取功能“坐”在它们上面。然后在尝试与主线程同步时可怕地死去


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

我的理解是,不需要线程。有时它们可以提高性能(并行计算),有时它们使生活变得更容易,甚至更困难(除非使用得当)。处理多个套接字肯定不需要线程,但根据应用程序的不同,线程可能是一个很好的设计选择。请详细说明“事件处理程序”。没有上下文,这是一个太宽泛的术语。事实上,事件处理程序只是一个回调子例程。“为每个文件描述符结构分配一个事件处理程序”是什么意思?POSIX中没有分配事件处理程序的方法。为每个套接字创建一个线程只是同时监视多个套接字的方法之一。通常,这是最简单的调试方法,但是它不能很好地扩展到很多套接字。其他选项包括:1)使用带非阻塞插座的单螺纹,循环逐个检查所有插座;2) 使用带有非阻塞套接字的单线程,并选择
/
poll
/
epoll
syscalls。谢谢。我为每个文件描述符创建了一个结构,用于存储指向处理程序函数的指针。当然不是标准的,在POSIX中,“检查事件”是的,但是使用
poll
ppoll
,这比
select
更现代、更容易使用@BenVoigt:谢谢。我已经更新了我的答案。但我习惯于使用
select
;)谢谢我实际上用过民意测验。但这是我第一次使用它,不知道它实际上是如何工作的。