यदि आपके पास एक साझा चर (कहें, एक वर्ग के स्थिर क्षेत्र के रूप में, या साझा ऑब्जेक्ट के क्षेत्र के रूप में) है, और उस फ़ील्ड या ऑब्जेक्ट को क्रॉस-थ्रेड का उपयोग करने जा रहा है, तो, हाँ, आप यह सुनिश्चित करने की आवश्यकता है कि उस चर के उपयोग परमाणु संचालन के माध्यम से संरक्षित किया गया हो। X86 प्रोसेसर में यह सुनिश्चित करने के लिए अंतर्निहित है कि यह होता है, और यह सुविधा सिस्टम के माध्यम से सामने आती है। थ्रेडिंग। इंटरलाक्ड क्लास विधियां।
उदाहरण के लिए:
class Program
{
public static Int64 UnsafeSharedData;
public static Int64 SafeSharedData;
static void Main(string[] args)
{
Action<Int32> unsafeAdd = i => { UnsafeSharedData += i; };
Action<Int32> unsafeSubtract = i => { UnsafeSharedData -= i; };
Action<Int32> safeAdd = i => Interlocked.Add(ref SafeSharedData, i);
Action<Int32> safeSubtract = i => Interlocked.Add(ref SafeSharedData, -i);
WaitHandle[] waitHandles = new[] { new ManualResetEvent(false),
new ManualResetEvent(false),
new ManualResetEvent(false),
new ManualResetEvent(false)};
Action<Action<Int32>, Object> compute = (a, e) =>
{
for (Int32 i = 1; i <= 1000000; i++)
{
a(i);
Thread.Sleep(0);
}
((ManualResetEvent) e).Set();
};
ThreadPool.QueueUserWorkItem(o => compute(unsafeAdd, o), waitHandles[0]);
ThreadPool.QueueUserWorkItem(o => compute(unsafeSubtract, o), waitHandles[1]);
ThreadPool.QueueUserWorkItem(o => compute(safeAdd, o), waitHandles[2]);
ThreadPool.QueueUserWorkItem(o => compute(safeSubtract, o), waitHandles[3]);
WaitHandle.WaitAll(waitHandles);
Debug.WriteLine("Unsafe: " + UnsafeSharedData);
Debug.WriteLine("Safe: " + SafeSharedData);
}
}
परिणाम:
असुरक्षित: -२४०५०२७५६४१ सुरक्षित: 0
एक दिलचस्प ओर ध्यान दें पर, मैं इस भाग गया Vista 64 पर x64 मोड में। यह दिखाता है कि 64 बिट फ़ील्ड रनटाइम द्वारा 32 बिट फ़ील्ड की तरह व्यवहार किया जाता है, यानी, 64 बिट ऑपरेशंस गैर-परमाणु हैं। किसी को पता है कि यह एक सीएलआर मुद्दा है या एक x64 मुद्दा है?
इंट 64 पर परमाणु संचालन के लिए, आप इंटरलाक्ड क्लास (http://msdn.microsoft.com/en-us/library/system.threading.interlocked.add.aspx) का उपयोग कर सकते हैं। –