为什么Apache MPM prefork.c使用互斥锁保护accept()函数?

8
我坐下来阅读了Apache的MPM prefork.c代码,发现此代码使用一个名为accept_mutex的变量来防止多个线程调用accept()。这很奇怪,因为据我所知,accept()是线程安全的

accept()是否线程安全?这是一个平台兼容性问题吗?如果是,有哪个平台实现了不安全的accept()


互斥锁的作用是避免“雷鸣群”问题。 - Flux
2个回答

6
这在Apache性能调优文档中有详细解释,位于“accept()序列化 - 多个套接字”部分。简而言之,在某些操作系统下,一个传入连接会唤醒所有正在select()poll()等待传入连接的Apache进程,但只会在其中一个进程上导致accept()成功,其他进程都失败。这是低效的,因此使用互斥锁确保每次只有一个进程接受传入连接。

2

请阅读您提供的源代码中的注释。看起来互斥锁并没有真正保护accept操作,而是保护需要轮询的监听套接字列表(请注意,在仅有一个监听套接字的情况下,至少在非破损系统上accept操作正常时不使用互斥锁)。如果这可以在运行时更改,则代码可能是正确的。但我有一种感觉他们只是在做一些荒谬的事情。这是Apache,所以您不应该期望高质量甚至合理的代码...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接