Windows में std::shared_mutex में बग की संभावना
- एक सॉफ़्टवेयर टीम ने Windows में
std::shared_mutex से जुड़ा अप्रत्याशित व्यवहार पाया।
- यह समस्या केवल MSVC में होती है; MinGW या अन्य प्लेटफ़ॉर्म पर नहीं।
- जब मुख्य thread exclusive lock हासिल करने के बाद कई child threads shared lock हासिल करने की कोशिश करते हैं, तो लगभग 1000 में 1 बार "deadlock" होता है।
- deadlock होने पर ठीक 1 child thread ही shared lock सफलतापूर्वक हासिल करता है, और बाकी child threads
lock_shared() पर हमेशा के लिए block हो जाते हैं।
- यह समस्या
std::shared_mutex, std::shared_lock/std::unique_lock या सीधे SRW functions को कॉल करने पर देखी गई।
कोड उदाहरण और बग का पुनरुत्पादन
- समस्या को पुनरुत्पादित करने वाला एक सरल कोड उपलब्ध कराया गया है।
- यह कोड उस प्रक्रिया को दोहराता है जिसमें मुख्य thread exclusive lock हासिल करता है, कई child threads shared lock हासिल करते हैं, और फिर उसे छोड़ते हैं।
- यह कोड केवल Windows MSVC implementation में
std::shared_mutex से जुड़ा बग दिखाता है।
विशेषज्ञों की राय
- STL developer ने कहा कि यह समस्या Windows API के बग जैसी लगती है।
- बग रिपोर्ट करने के सही चरणों पर चर्चा हुई, और STL developer ने अंदरूनी रूप से बग रिपोर्ट किया।
- दूसरे users ने इस समस्या की विस्तार से जाँच की और SRWLock implementation के एक खास बग को सीमित दायरे में पहचानने में योगदान दिया।
GN⁺ की राय
- यह लेख C++ developers के लिए खास तौर पर महत्वपूर्ण जानकारी देता है, क्योंकि
std::shared_mutex में संभावित बग multithreading applications के synchronization mechanism को प्रभावित कर सकता है।
- यदि बग की पुष्टि होती है, तो इसका असर C++ standard library implementation की विश्वसनीयता पर पड़ सकता है। developers को ऐसे मुद्दों के प्रति जागरूक रहना चाहिए और वैकल्पिक synchronization mechanisms पर विचार करना पड़ सकता है।
- यह समस्या खासकर high-performance या real-time systems में महत्वपूर्ण हो सकती है, क्योंकि ऐसे systems में deadlock गंभीर परिणाम ला सकता है।
- इस तकनीक को अपनाने से पहले, developers को संबंधित platform और compiler पर व्यापक testing करनी चाहिए ताकि यह सुनिश्चित किया जा सके कि इस तरह के बग मौजूद नहीं हैं।
- इस समस्या से निपटने के लिए developers Boost library जैसी वैकल्पिक synchronization libraries पर विचार कर सकते हैं। Boost का व्यापक रूप से परीक्षण किया गया है और यह कई platforms पर उपयोग होती है, इसलिए यह ऐसे मुद्दों के लिए एक स्थिर विकल्प दे सकती है।
1 टिप्पणियां
Hacker News की राय
एक उपयोगकर्ता ने यह जानना चाहा कि इतना बुनियादी मुद्दा इतने लंबे समय तक पकड़ में क्यों नहीं आया, और दूसरे उपयोगकर्ता द्वारा दिए गए एक भरोसेमंद जवाब का ज़िक्र किया। उन्होंने बताया कि कुछ मामलों में shared mode में lock लेने की कोशिश करने वाला thread गलती से exclusive mode में lock हासिल कर सकता है। यह तब होता है जब shared mode acquire करने वाला thread और exclusive mode release करने वाला thread एक ही समय पर चल रहे हों, जिससे atomic bit test-and-set operation आपस में overlap कर जाते हैं.
एक अन्य उपयोगकर्ता ने कहा कि Reader/Writer lock में आने वाले subtle bug उन्हें हैरान नहीं करते, और C++11 तथा
std::shared_mutexसे पहले Win32 आधारित internal implementation पर काम करने का अपना अनुभव साझा किया। उन्होंने कहा कि shared lock के साथ खराब अनुभवों की वजह से वे उन्हें तब तक टालते हैं जब तक बिल्कुल ज़रूरी न हो.एक उपयोगकर्ता ने बताया कि शीर्षक भ्रामक है, क्योंकि असली bug Windows API के slim reader/writer (SRW) lock में है, और यह इसलिए सामने आया क्योंकि
std::shared_mutexको SRW lock का उपयोग करके implement किया गया था। एक Microsoft कर्मचारी ने पुष्टि की कि यह bug अंदरूनी तौर पर Windows API टीम तक पहुँचा दिया गया है.एक उपयोगकर्ता ने पूछा कि क्या यही समस्या WINE के implementation में भी आती है, और कहा कि वे अपनी customized XP installation पर भी इसे test करना चाहते हैं। उन्होंने बताया कि उस installation में SRW API सहित कई extension जोड़े गए हैं, और SRW implementation पर आधारित keyed event API में deadlock पैदा करने वाली race condition को ठीक करने के लिए उन्होंने kernel patch किया था.
यह भी बताया गया कि program में एक bug है। इसमें non-atomic variable और atomic variable को मिलाकर
yield()check loop में इस्तेमाल किया गया है, जबकि non-atomic variable दूसरे thread के लिए cache coherence की गारंटी नहीं देता। इसकी वजह से loop हमेशा के लिए चल सकता है.एक उपयोगकर्ता ने कहा कि यह bug 2008 के Vista version तक जाता है, और उन्हें हैरानी है कि इतने लंबे समय तक किसी ने इसे पकड़ा नहीं। उन्होंने कहा कि सामान्य rwlock usage में shared lock न मिल पाने के random मामले आ सकते हैं, लेकिन deadlock नहीं होता.
एक उपयोगकर्ता ने कहा कि Windows API में bug report करना बहुत मुश्किल है। उन्हें Feedback Hub के ज़रिए report करने को कहा जाता है, लेकिन उन्होंने इसकी कड़ी आलोचना की कि यह लगभग बेअसर है। उस उपयोगकर्ता ने SRWLOCK से जुड़ा एक bug report किया था, जिसमें exclusive owner द्वारा ownership छोड़ने के बाद कई read thread एक साथ shared ownership लेने की कोशिश करें तो deadlock हो सकता है.
एक उपयोगकर्ता ने याद किया कि पहले MS product खरीदने पर support incidents मिलते थे, और अगर कोई असली bug मिलता था तो वह support incident refund कर दिया जाता था। उन्होंने कहा कि यह developers के लिए उपयोगी था और MS के लिए भी अच्छा system था, क्योंकि इससे असली समस्याएँ पकड़ने और documentation बेहतर करने के लिए feedback मिलता था। उन्होंने पूछा कि क्या यह program अब भी मौजूद है.
अंत में, एक उपयोगकर्ता ने Windows API के लिए bug report करना कठिन होने पर निराशा जताई.