accept()线程安全吗?

我正在用C编写一个简单的网络服务器,用于我正在做的课程。 一个要求是我们实现一个线程池来处理使用pthreads的连接。

我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法而不是我想到的方法:在前面创建我的所有线程,让他们全部循环接受电话。 接受的想法是阻塞所有空闲线程,当连接进入时,只给出一个文件描述符。 然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个再次接受的调用。 使用accept()作为信号量的调用。 这样可以简化实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接。 理论上它也会降低延迟,因为线程可以立即开始执行。

我的问题是,这样安全吗? 我打算实施它并尝试一下,但我还没准备好,我很想知道答案。 我在谷歌和这里搜索stackoverflow,但找不到任何人这样做。 接受线程安全吗? 我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是一个简单的内存/延迟权衡吗?

编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P

是。 这是设计multithreading服务器和公认设计实践的常用方法。

你也可以多次fork并让子进程调用accept ,这样你就可以在不需要线程库的情况下进行multithreading处理。 较旧的服务器执行此操作。