2017-12-24 136 views
10

मैं सोच रहा था, जहां यह सबसे अच्छा कुछ इस तरह के बारे में पूछने के लिए किया जाएगा, तो मैं मेटा (https://meta.stackexchange.com/questions/304981) पर इस प्रश्न पूछा और यहाँ का निर्देश दिया गया है, इसलिए यहाँ जाता है।कैसे ABSL :: Mutex की सशर्त महत्वपूर्ण वर्गों संभाल पाठक wakeups

मैं वास्तव में उत्सुक था कि absl::Mutex (https://github.com/abseil/abseil-cpp/blob/master/absl/synchronization/mutex.h) के साथ सशर्त महत्वपूर्ण वर्गों के Google के कार्यान्वयन में किस तरह के अनुकूलन बनाए गए थे। विशेष रूप से मैं सोच रहा था कि पाठक की स्थिति कब सच होती है जब वे रीडर वेकअप को संभालते हैं। क्या वे सभी अन्य पाठकों को प्रतीक्षा सूची में भी जगाते हैं? This line कि जोखिम एक हे (एन) हर बार Traversal और यह भी एक लिखने प्राथमिकता म्युटेक्स में झुंड गरजने जोखिम का संकेत है कि वे करते हैं लगता है .. नहीं है?

+0

बस mutex.cc में फ़ाइलों को शामिल करने पर पढ़ना, कोई देख सकता है कि वे pthread या window.h का उपयोग करते हैं। उस उच्च स्तरीय थ्रेडिंग लाइब्रेरी के साथ आप शायद कुछ भी जादू नहीं कर सकते हैं। जो भी यह थ्रेड उठाने वाला सिस्टम है। निचले स्तर के कोड के साथ आप जागने के लिए पाठक को नियंत्रित कर सकते हैं (या कम से कम उनमें से कुछ का चयन करें 'मैन 2 futex')। सुपर परतों के साथ रैपर के चारों ओर इस रैपर को पढ़ने में अपना समय बर्बाद न करें जो समस्या को हल करने के लिए मौजूद है जो वहां नहीं होगा अगर उपनगर नहीं था! – Oliv

+0

'futex' (लिनक्स पर) जो संभव है सार्वभौमिक को बाधित करेगा। फिर इसके चारों ओर कुछ भी निर्माण (म्यूटेक्स, सेमफोर, आदि ...) उतना ही सीमित होगा। – Oliv

उत्तर

4

मुझे लगता है कि यह डिजाइन और कार्यान्वयन अनुकूलन के बीच मतभेदों को निर्धारित करने के लिए महत्वपूर्ण है। ऐसा लगता है कि absl :: बेहतर डिजाइन किए गए घटकों को प्रदान करने के विरोध में उन डिज़ाइनों का समर्थन करने वाले कार्यान्वयन प्रदान करके बेहतर डिज़ाइन को प्राथमिकता देता है। कभी-कभी बेहतर डिज़ाइन स्वाभाविक रूप से बेहतर प्रदर्शन करने से बेहतर प्रदर्शन करता है, इसलिए परिणाम दोनों कारकों (सिनर्जी) पर अनुकूलित होता है। Absiel.io अधिक विस्तार से इस पर चर्चा करता है।

उनके स्रोत पर देख से, ABSL जादू लंबित पाठकों के लिए प्रसारण से बचने के लिए प्रयास करने के लिए प्रकट नहीं होता है, इस प्रकार हाँ, गरजने झुंड एक मुद्दा बना हुआ है। आम तौर पर, कोई कार्यान्वयन उस समस्या को सार्थक तरीके से संबोधित नहीं कर सकता है; यह एक डिजाइन समस्या है।

ताला के हिस्से के रूप हालत को एम्बेड करके ABSL: प्रोग्रामर से बचने के लिए, या आसपास डिजाइन, कि समस्या की अनुमति है। अभी भी एक झुंड है, लेकिन ताला कार्यान्वयन plan 9 nod here पतला करने में सक्षम है। यदि आप अच्छी तरह से जागने के अपने कारणों को डिज़ाइन करते हैं, उदाहरण के लिए मास्क में बिट्स, आप अपने प्रदर्शन को प्रभावित करने वाले नकली वेक-अप के बारे में चिंता किए बिना साझा/अनन्य ताले का सुरक्षित रूप से उपयोग कर सकते हैं।

यह एक 'डिजाइन अनुकूलन' का सार है: समस्या और अधिक स्पष्ट रूप स्रोत में वर्णन किया गया और जिसके परिणामस्वरूप कार्यान्वयन उच्च गुणवत्ता (प्रदर्शन, स्केलिंग, ...) अन्यथा की तुलना की है।

Plan9। हालत चर नींद के यूनिक्स कर्नेल धारणा (समय एक नहीं) और wakeup के बराबर हैं। जब आप पाते हैं कि किसी ऑब्जेक्ट को उस राज्य में नहीं है जिसकी आपको आवश्यकता है, तो आप इसे उस राज्य में लाने के लिए कुछ कार्रवाई करते हैं, फिर उस राज्य तक पहुंचने तक प्रतीक्षा करें। उदाहरण के लिए, आप किसी ऑब्जेक्ट को कैश में देख सकते हैं, और इसे खोजने पर वहां नहीं है, एक अमान्य बनाएं और अनुरोध करें कि इसे वैध बनाया जाए। यह सभी कैश प्रतिभागियों के बीच एक प्रकार की समरूपता की अनुमति देता है: वे ऑब्जेक्ट को लॉक करते हैं, मूल्यांकन करते हैं या अपने राज्य को अपडेट करते हैं, फिर ऑब्जेक्ट को अनलॉक करते हैं और इसमें और बदलाव की प्रतीक्षा करते हैं।

बदसूरत समस्या यह है कि एक है: एक साथ ऐसी कोई चीज़ नहीं है, और बी: लॉक हैंडलिंग त्रुटि प्रवण है (क्या मैं कोई अन्य ताला लगा रहा हूं? क्या इससे डेडलॉक हो सकता है?) और प्रोग्राम में अच्छी तरह से व्यक्त नहीं किया गया है । प्लान 9 की नींद और जागने ने इन्हें स्पष्ट रूप से विलय कर दिया, ताकि उस स्थिति पर जहां स्थिति की जांच की जा सके, किसी के लिए वस्तु को प्रभावित करना असंभव है। वास्तव में, संदर्भित पेपर का बिंदु यह है कि उस साधारण अनुबंध को लागू करना कितना मुश्किल है। एक बहु प्रसंस्करण वातावरण में जटिल अनुबंध for example से बचाए जाते हैं।

महत्वपूर्ण अनुकूलन (absl में :) यह है कि यह निर्धारित करने के लिए कि महंगी संदर्भ स्विच ऑपरेशन के माध्यम से गलत स्थिति में है, फिर सोने के लिए वापस जाना आवश्यक नहीं है। यदि कोड जो आपको उठाने के लिए चुन रहा है, यह सत्यापित कर सकता है कि ऑब्जेक्ट स्टेटस वह है जिसकी आपको रुचि है, उतना ही बेहतर। एक फ़ंक्शन कॉल/विधि आमंत्रण संदर्भ स्विच की तुलना में 100 गुना तेज है।

एब्स्लThis section दोनों जागरूकता के लिए उम्मीदवारों को कैसे चुना जाता है, और झुंड को कैसे हटाया जाता है। This section प्रसारण का उत्पादन करता है।

तो पूर्व अनुभाग सूची वेटर्स के तत्वों का चयन करता है, और बाद वाला अनुभाग उन्हें उठाता है। यदि आप लाइन 2203 की अन्य स्थिति देखते हैं, तो यह दिखाता है कि एक लेखक सूची को कैसे समाप्त कर देगा - w_walk-> जाग सच नहीं है, और wr_wait सेट किया गया है। इसके अलावा, 2015 और 2023 में पहले के परीक्षण इस सूची को बनाने से रोकते हैं यदि यह एक लेखन-जागरूकता है।

पर नज़र रखता है

obj.enter(); 
while (obj.state != StateIWant) { 
    obj.wait(); 
} 
... 
obj.exit(); 

गार्ड हालत निष्पादित करने के लिए इस सूत्र की आवश्यकता है। इस अवरुद्ध धागे को स्थानांतरित करने की कार्रवाई स्थिति को निष्पादित करने की लागत के कई बार हो सकती है। इसके विपरीत:

obj.wait(^{return obj.state == StateIWant;}); 
... 
obj.exit(); 

, संदर्भ जो भी की धागा प्रतीक्षा (। यानी बुला निकास) की अनुमति देने गया था में स्थिति का मूल्यांकन करने और इस प्रकार से परहेज महंगा संदर्भ बेकार मामलों में स्विच इंतजार कॉल की अनुमति होगी।

+0

कोई विचार नहीं है कि "नामित वाकर" कार्यक्षमता उनके कोड में क्या है? https://github.com/abseil/abseil-cpp/blob/be40fdf1a86f4956d2f8125a7b6bd6d34e133c2d/absl/synchronization/mutex.cc#L593 मुझे लगता है कि धागे को कैसे जगाया जाता है – Curious

+0

क्या आपने कभी किसी के लिए दरवाजा रखा है और खुद को लोगों की एक पंक्ति के लिए दरवाजा पकड़ा पाया? अगर मैं इसे सही तरीके से पढ़ रहा हूं, तो यह थोड़ा सा है। दरवाजा, इस मामले में, अंतर्निहित सिंक्रनाइज़ेशन सेवा है (उदाहरण के लिए। Futex, Win32, SEM, ...), और कोड बेहतर प्रदर्शन के लिए इसे टालने का प्रयास कर रहा है। उस ने कहा, ऐसा लगता है कि ऐसा होने पर मामले (ओं) की कल्पना नहीं हो सकती है, लेकिन मैं कभी-कभी लोगों की एक पंक्ति के लिए दरवाजा पकड़ रहा हूं .. – mevets

संबंधित मुद्दे