Accept() 是线程安全的吗?

2024-05-09

我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器。我们的一项要求是实现一个线程池来使用 pthread 处理连接。

我知道我将如何粗略地执行此操作(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友建议了一种替代方法而不是我想到的方法:预先创建我的所有线程,并让它们在接受调用时永远循环。这个想法是,accept 将阻塞所有空闲线程,并且当连接进入时,仅将文件描述符提供给一个。然后,当给定线程完成连接时,它会循环回来并再次阻塞调用accept。本质上使用对accept()的调用作为信号量。他认为这将大大简化实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好连接。理论上它的延迟也会更低,因为线程可以立即开始执行。

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

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


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

你也可以fork多次并让子进程调用accept,这将允许您无需线程库即可进行多线程处理。较旧的服务器会这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Accept() 是线程安全的吗? 的相关文章

随机推荐