我坐下來看Apache's MPM prefork.c,這段代碼使用一個名爲accept_mutex
的變量來防止多線程調用accept()
。這很奇怪,因爲據我所知accept()
is thread-safe。爲什麼Apache MPM prefork.c使用互斥體來保護accept()?
是accept()線程安全嗎?這是平臺兼容性問題嗎?如果是的話,那麼什麼平臺實現了非線程安全的accept()
?
我坐下來看Apache's MPM prefork.c,這段代碼使用一個名爲accept_mutex
的變量來防止多線程調用accept()
。這很奇怪,因爲據我所知accept()
is thread-safe。爲什麼Apache MPM prefork.c使用互斥體來保護accept()?
是accept()線程安全嗎?這是平臺兼容性問題嗎?如果是的話,那麼什麼平臺實現了非線程安全的accept()
?
這在Apache performance tuning documentation,在「accept()
序列化 - 多個套接字」下解釋。簡而言之,至少在某些操作系統下,傳入連接會喚醒全部 Apache進程正在等待select()
或poll()
中的傳入連接,但會導致accept()
在除其中一個之外的所有進程上都失敗。這是低效的,所以使用互斥鎖來確保一次只有一個進程接受傳入連接。
閱讀您鏈接到的來源中的評論。似乎互斥鎖並不真正保護accept
操作,但需要輪詢的偵聽套接字列表(請注意,當只有一個偵聽套接字時,不會使用互斥鎖,至少不會在未破壞的系統上使用,其中accept
工作正確)。如果這可能在運行時改變,那麼代碼可能是正確的。但我有一種感覺,他們只是在做一些無意義的事情。這是Apache,所以你不應該期望高質量或甚至合理的代碼...
那麼,它*有*我+1 +1直到結束語.. – 2013-02-24 04:53:48
+1這是合理的。 – rook 2013-02-24 04:55:49