2009-05-28 17 views

उत्तर

10

Interlocked.Exchange है। यह थ्रेड-सुरक्षित, परमाणु कॉल में करता है।


टिप्पणियों के बाद संपादित करें:

बस स्पष्ट करने के लिए कि यह कैसे Interlocked.Exchange का उपयोग कर काम करता है, आप क्या करेंगे:

left = Interlocked.Exchange(ref right, left); 

यह बराबर होगी (प्रभाव में) कर रहे हैं:

Swap(ref left, ref right); 

हालांकि, इंटरलाक्ड। एक्सचेंज इसे परमाणु ऑपरेशन के रूप में करता है, इसलिए यह थ्रेडसेफ है।

+1

इंटरलाक्ड। एक्सचेंज एक मान सेट करता है, यह वास्तव में मूल्यों को स्वैप नहीं करता है। आपको अभी भी एक अस्थायी सहेजने की आवश्यकता होगी, और इंटरलाक्ड कॉल करें। दो बार एक्सचेंज करें, इसलिए आपको वास्तव में कुछ भी हासिल नहीं होता है। – jrista

+1

इंटरलाक्ड। एक्सचेंज वास्तव में निर्दिष्ट स्वैप के बराबर नहीं है। यह केवल पहले मान को बदलता है और दूसरे (स्वयं) को स्पर्श नहीं करता है। –

+1

@ मेहद्राद: बाएं = इंटरलाक्ड एक्सचेंज (रेफरी दाएं, बाएं); –

3

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

List<int> test; 
// ... 
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array 
संबंधित मुद्दे