8

我坐下来阅读Apache 的 MPM prefork.c,这段代码使用了一个名为的变量accept_mutex来防止多个线程调用accept(). 这很奇怪,因为据我所知accept()是 thread-safe

接受()线程安全吗?这是平台兼容性问题吗?如果是这样,哪个平台实现了非线程安全accept()

4

2 回答 2

6

这在Apache 性能调整文档中的“accept()序列化 - 多个套接字”下进行了解释。简而言之,至少在某些操作系统下,传入连接将唤醒所有等待传入连接的 Apache 进程select()or poll(),但会导致accept()除一个之外的所有进程失败。这是低效的,因此使用互斥锁来确保一次只有一个进程接受传入连接。

于 2013-02-24T04:50:46.737 回答
2

阅读您链接到的来源中的评论。似乎互斥锁并没有真正保护accept操作,而是需要轮询的侦听套接字列表(请注意,只有一个侦听套接字时不使用互斥锁,至少在accept正常工作的非损坏系统上不使用) . 如果这可以在运行时改变,那么代码可能是正确的。但我有一种感觉,他们只是在做一些荒谬的事情。这是 Apache,所以你不应该期望高质量甚至合理的代码......

于 2013-02-24T04:42:15.863 回答