我坐下来阅读Apache 的 MPM prefork.c,这段代码使用了一个名为的变量accept_mutex
来防止多个线程调用accept()
. 这很奇怪,因为据我所知accept()
是 thread-safe。
接受()线程安全吗?这是平台兼容性问题吗?如果是这样,哪个平台实现了非线程安全accept()
?
我坐下来阅读Apache 的 MPM prefork.c,这段代码使用了一个名为的变量accept_mutex
来防止多个线程调用accept()
. 这很奇怪,因为据我所知accept()
是 thread-safe。
接受()线程安全吗?这是平台兼容性问题吗?如果是这样,哪个平台实现了非线程安全accept()
?
这在Apache 性能调整文档中的“accept()
序列化 - 多个套接字”下进行了解释。简而言之,至少在某些操作系统下,传入连接将唤醒所有等待传入连接的 Apache 进程select()
or poll()
,但会导致accept()
除一个之外的所有进程失败。这是低效的,因此使用互斥锁来确保一次只有一个进程接受传入连接。
阅读您链接到的来源中的评论。似乎互斥锁并没有真正保护accept
操作,而是需要轮询的侦听套接字列表(请注意,只有一个侦听套接字时不使用互斥锁,至少在accept
正常工作的非损坏系统上不使用) . 如果这可以在运行时改变,那么代码可能是正确的。但我有一种感觉,他们只是在做一些荒谬的事情。这是 Apache,所以你不应该期望高质量甚至合理的代码......