2013-02-24 145 views
8

मैं बैठ गया और Apache's MPM prefork.c पढ़ा और यह कोड नामक एक चर का उपयोग कर रहा है ताकि एकाधिक धागे accept() पर कॉल करने से रोके जा सकें। यह अजीब है क्योंकि जहां तक ​​मुझे accept() is thread-safe पता है।Apache MPM prefork.c स्वीकार करने के लिए एक म्यूटेक्स का उपयोग क्यों करता है()?

स्वीकार है() थ्रेड सुरक्षित है? क्या यह एक मंच संगतता मुद्दा है? यदि ऐसा है तो कौन सा मंच गैर-थ्रेड-सुरक्षित accept() लागू करता है?

उत्तर

6

यह Apache performance tuning documentation में accept() सीरियलाइजेशन - एकाधिक सॉकेट "के तहत समझाया गया है। संक्षेप में, कम से कम कुछ ऑपरेटिंग सिस्टम के तहत, आने वाले कनेक्शन सभी अपाचे प्रक्रियाएं select() या poll() में आने वाले कनेक्शन की प्रतीक्षा कर रहे हैं, लेकिन accept() का कारण बन जाएगा, लेकिन उनमें से एक पर असफल हो जाएगा। यह अक्षम है, इसलिए यह सुनिश्चित करने के लिए एक म्यूटेक्स का उपयोग किया जाता है कि केवल एक ही प्रक्रिया एक समय में आने वाले कनेक्शन को स्वीकार करती है।

+0

+1 उचित है। – rook

2

आपके द्वारा लिंक किए गए स्रोत में टिप्पणियां पढ़ें। ऐसा लगता है कि म्यूटेक्स वास्तव में accept ऑपरेशन की सुरक्षा नहीं कर रहा है, लेकिन सुनने वाले सॉकेट की सूची जिसे पोल करने की आवश्यकता है (ध्यान दें कि म्यूटेक्स का उपयोग तब नहीं किया जाता है जब केवल एक सुनवाई सॉकेट होती है, कम से कम गैर-टूटी हुई प्रणालियों पर नहीं, जहां accept काम करता है अच्छी तरह)। अगर यह रनटाइम पर बदल सकता है, तो कोड शायद सही है। लेकिन मुझे एहसास है कि वे सिर्फ कुछ बकवास कर रहे हैं। यह अपाचे है, इसलिए आपको उच्च गुणवत्ता या यहां तक ​​कि उचित कोड की उम्मीद नहीं करनी चाहिए ...

+4

ठीक है, यह * मेरे पास +1 बंद होने तक मेरा +1 था .. –