कहें कि हमारे पास एकल-निर्माता-थ्रेड एकल-उपभोक्ता-थ्रेड लॉकलेस कतार है, और निर्माता बिना किसी डेटा के उत्पादन के लंबे समय तक जा सकता है। जब कतार में कुछ भी नहीं है (बिजली की बचत के लिए और अन्य प्रक्रियाओं/धागे के लिए सीपीयू को मुक्त करने के लिए) उपभोक्ता धागे को नींद देना फायदेमंद होगा। यदि कतार लॉकलेस नहीं थी, तो इस समस्या को हल करने का सीधा तरीका है कि उत्पादन थ्रेड एक म्यूटेक्स को लॉक करें, अपना काम करें, एक कंडीशन वैरिएबल सिग्नल करें और अनलॉक करें, और रीडिंग थ्रेड के लिए म्यूटेक्स को लॉक करने के लिए, कंडीशन वैरिएबल पर प्रतीक्षा करें , इसे पढ़ना, फिर अनलॉक करें। लेकिन अगर हम एक लॉकलेस कतार का उपयोग कर रहे हैं, तो म्यूटेक्स का उपयोग करके वैसे ही एक ही तरीके से लॉकलेस कतार का उपयोग करने से प्राप्त होने वाले प्रदर्शन को खत्म कर दिया जाएगा।लॉकलेस कतार मतदान के लिए सबसे तेज़ रेस फ्री विधि क्या है?
अनुभवहीन समाधान है, तो, म्युटेक्स अनलॉक वास्तविक कार्य (कतार में प्रविष्टि) रखने पूरी तरह से ताला बाहर है, और करने के लिए म्युटेक्स ताला कतार में प्रत्येक प्रविष्टि के बाद निर्माता है, हालत चर का संकेत है क्या उपभोक्ता वही करता है, म्यूटेक्स को लॉक कर रहा है, कंडीशन वैरिएबल पर इंतजार कर रहा है, इसे अनलॉक कर रहा है, कतार से सबकुछ खींच रहा है, फिर लॉक के बाहर कतार पढ़ने को दोहराएं। यद्यपि यहां रेस की स्थिति है: पाठक के बीच कतार खींचने और सोने जाने के बीच, निर्माता ने कतार में एक आइटम डाला होगा। अब पाठक सो जाएगा, और तब तक अनिश्चित काल तक रह सकता है जब तक कि निर्माता किसी अन्य आइटम को सम्मिलित न करे और फिर से कंडीशन वैरिएबल को सिग्नल करे। इसका मतलब है कि आप कतार के माध्यम से यात्रा करने के लिए बहुत लंबे समय तक लगने वाले विशेष सामानों के साथ कभी-कभी समाप्त हो सकते हैं। यदि आपकी कतार हमेशा सक्रिय होती है तो यह कोई समस्या नहीं हो सकती है, लेकिन यदि यह हमेशा सक्रिय होती है तो आप शायद पूरी तरह से हालत चर को भूल सकते हैं।
AFAICT समाधान निर्माता के लिए ऐसा व्यवहार करने के लिए है जैसे कि यह नियमित आवश्यकताओं-लॉकिंग कतार के साथ काम कर रहा हो। इसे म्यूटेक्स को लॉक करना चाहिए, लॉकलेस कतार में डालें, कंडीशन वैरिएबल को सिग्नल करें, अनलॉक करें। हालांकि, उपभोक्ता को अलग-अलग व्यवहार करना चाहिए। जब यह जागता है, तो इसे क्यूई पढ़ने तक प्रतीक्षा करने के बजाय तुरंत म्यूटेक्स को अनलॉक करना चाहिए। फिर इसे कतार के रूप में खींचना चाहिए क्योंकि यह इसे संसाधित कर सकता है। आखिरकार, जब उपभोक्ता सोने के बारे में सोच रहा है, तो क्या इसे म्यूटेक्स को लॉक करना चाहिए, जांचें कि क्या कोई डेटा है या नहीं, तो अगर अनलॉक करें और इसे संसाधित करें या नहीं, तो स्थिति चर पर प्रतीक्षा करें। इस तरह म्यूटेक्स को लॉकफुल कतार के साथ कम से कम दंडित किया जाता है, लेकिन कतार पर अभी भी छोड़े गए डेटा के साथ सोने का कोई खतरा नहीं है।
क्या यह करने का सबसे अच्छा तरीका है? क्या विकल्प हैं?
नोट: द्वारा 'सबसे तेजी से' मैं वास्तव में ', सबसे तेजी से अधिक से अधिक कतार जाँच करने के लिए एक कोर समर्पित बिना' मतलब लेकिन उस शीर्षक में फिट नहीं होता, पी
एक वैकल्पिक: निष्पक्ष समाधान के साथ जाएं, लेकिन उपभोक्ता को कंडीशन वैरिएबल पर अधिकतम विलंबता के अनुरूप टाइमआउट के साथ प्रतीक्षा करें, जिसे आप कतार के माध्यम से यात्रा करने वाले आइटम के लिए सहन करने के इच्छुक हैं। यदि वांछित टाइमआउट काफी छोटा है, तो यह आपके ओएस के लिए न्यूनतम प्रतीक्षा समय से नीचे हो सकता है या फिर भी बहुत अधिक CPU का उपभोग कर सकता है।
क्या आपके पास उत्पादक सिग्नल वैरिएबल सिग्नल वैरिएबल नहीं हो सकता है जब भी यह कुछ उत्पन्न करता है? इसे म्यूटेक्स की आवश्यकता क्यों है? – Gabe
@Gabe: दो कारण। सबसे पहले, इस मामले में, क्योंकि निर्माता कुछ उत्पाद उत्पन्न कर सकता है और जब उपभोक्ता किसी आइटम को संसाधित करता है और जब यह स्थिति चर पर प्रतीक्षा करने का निर्णय लेता है तो सिग्नल को आग लगती है। फिर उपभोक्ता सो जाएगा और अगली बार सिग्नल को फायर करने तक निर्माता द्वारा बनाई गई वस्तु कतार पर फंस जाएगी। दूसरा, क्योंकि कम से कम pthreads एपीआई में, आप mutexes के बिना शर्त चर का उपयोग नहीं कर सकते हैं। आपको वास्तव में प्रतीक्षा समारोह में एक म्यूटक्स पास करना होगा। मुझे नहीं पता कि हालत चर के सभी कार्यान्वयन वास्तव में उन्हें आवश्यक हैं या नहीं। –
@Gabe: एक गलत धारणा जो आपको सोचने के लिए प्रेरित कर सकती है कि यह सोच रहा है कि अगर सिग्नल वैरिएबल पर कुछ भी इंतजार नहीं कर रहा है तो सिग्नल निकाल दिया जाता है, अगली बार जब कुछ हालत परिवर्तनीय पर इंतजार कर रहा है तो उसे तत्काल जागृत किया जाएगा, लेकिन वह नहीं है मामला नहीं है। यदि आप सिग्नल चर पर इंतजार कर रहे हैं तो सिग्नल फायर पर इंतजार नहीं कर रहे हैं, जहां तक आप जानते हैं कि यह कभी नहीं हुआ। इस अर्थ में एक शर्त चर पर प्रतीक्षा करना एक फ़ाइल/सॉकेट/पाइप पर मतदान/चयन का उपयोग करने से अलग है। –