तक पहुंचने वाले विभिन्न धागे में कुछ कोड है जो मेमोरीस्ट्रीम ऑब्जेक्ट को डेटा को GetBuffer() पर कॉल करके सीधे डेटा बफर में लिखता है। यह स्थिति और SetLength() गुणों का उचित रूप से उपयोग और अद्यतन करता है।मेमोरीस्ट्रीम
यह कोड सही समय 99.9 999% काम करता है। सचमुच। केवल हर 100,000 पुनरावृत्तियों में यह बार-बार होगा। विशिष्ट समस्या यह है कि मेमोरीस्ट्रीम की स्थिति संपत्ति अचानक उचित मान के बजाय शून्य लौटाती है।
हालांकि, कोड जोड़ा गया था जो 0 के लिए जांच करता है और एक अपवाद फेंकता है जिसमें मेमोरीस्ट्रीम गुणों जैसे लॉग और लंबाई की एक अलग विधि में लॉग शामिल है। वे सही मूल्य वापस करते हैं। उसी विधि के भीतर लॉगिंग के आगे के अतिरिक्त से पता चलता है कि जब यह दुर्लभ स्थिति होती है, तो स्थिति केवल इस विशेष विधि के अंदर शून्य होती है।
ठीक है। जाहिर है, यह एक थ्रेडिंग मुद्दा होना चाहिए। और सबसे अधिक संभावना एक संकलक अनुकूलन मुद्दा।
हालांकि, इस सॉफ़्टवेयर की प्रकृति यह है कि यह शेड्यूलर के साथ "कार्यों" द्वारा व्यवस्थित है और इसलिए किसी भी वास्तविक ओ/एस थ्रेड में से कोई भी इस कोड को किसी भी समय चला सकता है - लेकिन कभी भी एक से अधिक नहीं पहर।
तो मेरा अनुमान है कि आम तौर पर ऐसा होता है कि एक ही थ्रेड इस विधि के लिए उपयोग करता रहता है और फिर दुर्लभ अवसर पर एक अलग धागा का उपयोग किया जाता है। (थ्रेड आईडी को कैप्चर और तुलना करके इस सिद्धांत का परीक्षण करने के लिए बस विचार करें।)
फिर कंपाइलर अनुकूलन के कारण, अलग-अलग धागे को सही मान कभी नहीं मिलता है। यह एक "पुराना" मूल्य हो जाता है।
आमतौर पर इस तरह की स्थिति में मैं चरम पर एक "अस्थिर" कीवर्ड लागू करता हूं यह देखने के लिए कि क्या यह ठीक करता है। लेकिन इस मामले में चर मेमोरीस्ट्रीम ऑब्जेक्ट के अंदर हैं।
क्या किसी के पास कोई अन्य विचार है? या इसका मतलब यह है कि हमें अपनी मेमोरीस्ट्रीम ऑब्जेक्ट को कार्यान्वित करना है?
निष्ठा से, वेन
संपादित करें: बस एक परीक्षण है जो इस विधि के लिए कॉल की कुल संख्या में गिना जाता है और समय की संख्या ManagedThreadId आखिरी कॉल की तुलना में अलग है मायने रखता भाग गया। यह लगभग 50% समय है कि यह थ्रेड स्विच करता है - उनके बीच वैकल्पिक। तो ऊपर मेरा सिद्धांत लगभग निश्चित रूप से गलत है या त्रुटि कहीं अधिक होती है।
संपादित करें: यह बग इतना ही कम होता है कि किसी भी आत्मविश्वास को महसूस करने से पहले बग के बिना चलाने में लगभग एक सप्ताह लग जाएगा, यह वास्तव में चला गया है। इसके बजाए, समस्या की प्रकृति की पुष्टि करने के लिए प्रयोगों को चलाने के लिए बेहतर है।
संपादित करें: वर्तमान में लॉकिंग को मेमोरीस्ट्रीम का उपयोग करने वाले 5 तरीकों में से प्रत्येक में लॉक() कथन के माध्यम से संभाला जाता है।
तुल्यकालन आपरेशन सभी स्मृति अपने उपयोगकर्ता के अंतरिक्ष चर के लिए सही अर्थ विज्ञान सुनिश्चित करने के लिए बाधाओं को आह्वान। आपको 'अस्थिर' की आवश्यकता नहीं है। कुछ और गलत है। –