तक पहुंच बनाएं मुझे अच्छी तरह से पता है कि पहले से ही इसी तरह के प्रश्न पूछे गए हैं और मुझे भी पता है कि ऑपरेशन सबसे अधिक परमाणु नहीं है, लेकिन मैं अभी भी पूछ रहा हूं निष्क्रिय जिज्ञासा और उम्मीद में कि परमाणु बनाने के लिए कुछ रास्ता है।हस्ताक्षरित चार थ्रेड-सुरक्षित (परमाणु)
स्थिति: struct
के अंदर, Busy
नामक एक हस्ताक्षरित चार चर है। (इसे वहां से बाहर ले जाया जा सकता है और अपने आप पर खड़ा हो सकता है)।
यह चर Busy
दो समवर्ती धागे द्वारा संशोधित किया गया है, जो शेड्यूलिंग पर बिट सेट करता है और जो निर्धारित समय के पूरा होने पर उन्हें साफ़ करता है।
अभी, समय निर्धारण इस तरह दिखता है:
while(SEC.Busy&(1 << SEC.ReqID))
if(++SEC.ReqID == 5) SEC.ReqID = 0;
sQuery.cData[2] = SEC.ReqID;
bitmaks के समाशोधन इस तरह दिखता है, जबकि:
SEC.Busy &= ~(1 << sQuery->cData[2]);
CDATA [2] मूल रूप से जानकारी के बारे में जो स्लॉट प्रयोग किया जाता है वहन करती है नेटवर्क पर और किसी अन्य थ्रेड में कॉलबैक के माध्यम से वापस आता है।
अब प्रश्न: मैं कैसे सुनिश्चित कर सकता हूं कि SEC.Busy (जो इस परेशानी की स्थिति में एकमात्र चर है) एक म्यूटेक्स का उपयोग किये बिना एक ही समय में इसे बदलने की कोशिश कर रहे दो धागे से अलग नहीं हो जाता है, यदि संभव हो तो महत्वपूर्ण अनुभाग या पसंद के कुछ भी?
मैंने स्थानीय चर में SEC.Busy की सामग्री को असाइन करने का भी प्रयास किया है, फिर उसे बदलें और फिर चर को वापस लिखें, लेकिन दुर्भाग्यवश यह ऑपरेशन परमाणु प्रतीत नहीं होता है।
मैं इस समय बोर्लैंड सी ++ बिल्डर 6 का उपयोग कर रहा हूं, हालांकि एक जीसीसी समाधान भी ठीक होगा।
बहुत बहुत धन्यवाद।
एक भी चार पर बिट्स की स्थापना भयानक लग रहा है * *। समेकन का झुकाव साझा कर रहा है, और यहां आप बिना किसी व्यर्थ साझाकरण के टन को लागू कर रहे हैं। यदि आप स्मृति को छोड़ सकते हैं, तो प्रत्येक ध्वज को किसी शब्द के आकार पर कब्जा कर लें, या फिर एक संपूर्ण कैश लाइन (64 बाइट्स) बेहतर हो। –
@KerrekSB तो आप सुझाव दे रहे हैं कि मैं एक चरित्र के बजाय बुलियन वर्णों की एक सरणी का उपयोग कर रहा हूं, सही? – ATaylor
मैं शायद सुझाव दे रहा हूं कि आप एक बहुत ही स्पैस सरणी का उपयोग कर रहे हैं जो गद्देदार है ताकि प्रत्येक तत्व 64-बाइट सीमा पर शुरू हो। इस तरह, किसी भी झंडे की जांच किसी भी अलग ध्वज जांच के साथ टक्कर नहीं है। (यही कारण है कि अपने प्रश्न के साथ कोई लेना देना नहीं है, लेकिन यह एक काफी महत्वपूर्ण विचार है।) –