2013-02-24 25 views
8

Tôi ngồi xuống và đọc Apache's MPM prefork.c và mã này đang sử dụng biến số được gọi là accept_mutex để ngăn nhiều chủ đề gọi accept(). Điều này thật kỳ lạ bởi vì theo như tôi biết accept() is thread-safe.Tại sao Apache MPM prefork.c sử dụng một mutex để bảo vệ accept()?

Chấp nhận() có an toàn không? Đây có phải là vấn đề tương thích với nền tảng không? Nếu vậy nền tảng nào triển khai thực hiện an toàn không an toàn accept()?

Trả lời

6

Điều này được giải thích trong Apache performance tuning documentation, trong "accept() Serialization - nhiều ổ cắm". Tóm lại, trong ít nhất một số hệ điều hành, kết nối đến sẽ đánh thức tất cả Các quá trình Apache đang chờ kết nối đến trong select() hoặc poll(), nhưng sẽ gây ra lỗi trên tất cả trừ một trong số chúng. Điều này là không hiệu quả, do đó, một mutex được sử dụng để đảm bảo rằng chỉ có một quá trình chấp nhận một kết nối đến tại một thời điểm.

+0

+1 điều đó là hợp lý. – rook

2

Đọc nhận xét trong nguồn bạn đã liên kết. Có vẻ như mutex không thực sự bảo vệ hoạt động accept, nhưng danh sách các ổ cắm nghe cần phải được thăm dò (lưu ý rằng mutex không được sử dụng khi chỉ có một ổ cắm nghe, ít nhất là không phải trên các hệ thống không bị hỏng nơi accept hoạt động đúng cách). Nếu điều này có thể thay đổi khi chạy, thì mã có thể đúng. Nhưng tôi có cảm giác họ đang làm điều gì đó vô nghĩa. Đây là Apache, vì vậy bạn không nên mong đợi mã chất lượng cao hoặc thậm chí hợp lý ...

+4

Vâng, nó * đã * +1 của tôi cho đến khi các câu lệnh đóng .. –