2015-03-04 6 views
15
public static int Add(ref int location1,int value) 

मैं बहु-थ्रेडिंग परिदृश्य में एक परमाणु तरीके से किसी संख्या में जोड़ने के लिए इंटरलाक्ड। जोड़ें (रेफ इंट लोकेशन 1, int मान) विधि का उपयोग करने का प्रयास कर रहा था। लेकिन मुझे खुद से एक सवाल आया: विधि फिर से स्थान 1 मान क्यों लौटाती है? इसके बजाय हम सीधे वेरिएबल का उपयोग कर सकते हैं जिसे "रेफरी" के रूप में पारित किया जाता है।Interlocked.Add() विधि को मान वापस क्यों करना है?

कुछ छद्म नीचे कोड:

int a = 6; 
int b = 7; 

// some thing else 

Interlocked.Add(ref a, b); 

// Use the variable 'a' here. 
+3

[आप एक interlocked आपरेशन उपयोग करने के लिए एक अनूठा मूल्य उत्पन्न करने के लिए जा रहे हैं, इससे पहले कि आप यह चला गया इसका इस्तेमाल करने की जरूरत है] (http://blogs.msdn.com/b /oldnewthing/archive/2013/04/25/10413997.aspx)। – GSerg

+1

मैं सी ++ 11 मेमोरी मॉडल के बारे में पढ़ने की सिफारिश करता हूं, और इसमें उनके द्वारा किए गए सभी छोटे विवरण क्यों हैं। यह सी # नहीं है (सी # सी ++ 11 मेमोरी मॉडल से पहले आया था), लेकिन यह दिखाता है कि यह कितना अविश्वसनीय रूप से अनजान परमाणु संचालन है जब तक कि आप कुछ हार्डवेयर सीमाओं परमाणु संचालन के साथ काम करने के लिए डिज़ाइन नहीं किए जाते हैं, यह दिखाने का उल्लेखनीय रूप से अच्छा काम करता है। यदि आप MEMORY_ORDER_CONSUME और kill_dependency के बारे में पढ़ते समय प्यूक नहीं करते हैं, तो आप परमाणु संचालन करने के लिए तैयार हैं (मुझे अभी भी मेरे गले के पीछे थोड़ा सा पित्त मिलता है)। –

+6

https://msdn.microsoft.com/en-us/magazine/jj863136.aspx जैसे कुछ सी # विशिष्ट के साथ इसका पालन करें। सबसे महत्वपूर्ण दो अंतर्दृष्टि मैं आपको दे सकता हूं हालांकि (1) जिस क्षण आप साझा-मेमोरी मल्टीथ्रेडेड प्रोग्रामिंग करना शुरू करते हैं, आपको अपने दृष्टिकोण को बदलने की आवश्यकता होती है, "वेरिएबल्स के मान तब तक स्थिर होते हैं जब तक कि कुछ उन्हें बदल नहीं लेता" "चर के मूल्य लगातार होते हैं बदलते हैं जब तक कि कुछ उन्हें समान नहीं रखता ", और (2) आप बस इस सामान को बग-मुक्त प्रोग्राम लिखने के लिए पर्याप्त रूप से समझ नहीं पाते हैं। जितना अधिक मैं थ्रेडिंग के बारे में सीखता हूं, उतना कम आत्मविश्वास मैं हूं कि मैं इसे सही समझ रहा हूं। –

उत्तर

31

चर ref aInterlocked रिटर्न से पहले "फिर" को बदल सकता है क्योंकि (या यहां तक ​​कि बाद यह वापस आती है और आप a का उपयोग करने से पहले)। फ़ंक्शन इसके बजाय गणना की गई मान देता है।

उदाहरण:

int a = 5; 

// on thread 1 
int b = Interlocked.Add(ref a, 5); // b = 10 

// on thread 2, at the same time 
int c = Interlocked.Add(ref a, 5); // c = 15 

// on thread 1 
Thread.Sleep(1000); // so we are "sure" thread 2 executed 
Thread.MemoryBarrier(); // just to be sure we are really reading a 
bool x1 = (b == 10); // true 
bool x2 = (a == 15); // true 
संबंधित मुद्दे

 संबंधित मुद्दे