आप कहते हैं कि आप प्रदर्शन कारणों से lock
का उपयोग नहीं करना चाहते हैं - लेकिन आपने इसका परीक्षण किया है? एक अनचाहे लॉक (जो इसकी आवाज़ से होने की संभावना है) बहुत सस्ता है।
जब मैं थ्रेडिंग (और सामान्य रूप से, लेकिन विशेष रूप से थ्रेडिंग के लिए) आता हूं तो मैं आमतौर पर "चालाक और संभवतः बेहतर प्रदर्शन" के बजाय "स्पष्ट रूप से सही" के लिए जाता हूं।
लॉकिंग के साथ और बिना अपने ऐप को बेंचमार्क करें, और देखें कि क्या आप अंतर भी देख सकते हैं। यदि लॉकिंग महत्वपूर्ण अंतर बनाता है तो सुनिश्चित करें कि चालाक सामान का उपयोग करें। अन्यथा, मैं बस एक ताला के साथ रहना होगा।
using System;
using System.Reflection;
using System.Threading;
public class Test
{
private static int count = int.MaxValue-1;
public static uint IncrementCount()
{
int newValue = Interlocked.Increment(ref count);
return (uint) newValue;
}
public static void Main()
{
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
}
}
आउटपुट::
2147483647
2147483648
2147483649
(
एक बात आप क्या करना चाहते हो सकता है एक int
साथ Interlocked.Increment
का उपयोग करें और बस जब आवश्यक एक uint
पाने के लिए यह डाली, इस तरह है दूसरे शब्दों में यह किसी भी समस्या के साथ लपेटता है।)
स्रोत
2009-06-01 12:46:26
यह केवल यह सुनिश्चित करता है कि v में कोई भी परिवर्तन आभासी तुरंत स्मृति के लिए लिखा जाता है, जब तक थ्रेड पैदावार या मूल्य को किसी रजिस्टर में विस्थापित नहीं किया जाता है, तब तक प्रतीक्षा करने की बजाय। यह क्षेत्र तक पहुंच की रक्षा नहीं करता है, यानी दो (या अधिक) धागे एक ही मूल्य को पढ़ सकते हैं, एक बार वृद्धि कर सकते हैं, और लिख सकते हैं, प्रभावी ढंग से मूल्य को बढ़ाकर 1. –
कृपया उपर्युक्त आवश्यकताओं को पढ़ें और उदाहरण भी http: //msdn.microsoft.com/en-us/library/7a2f3ay4.aspx। दिए गए मामले के लिए यह पर्याप्त है। – Sesh
Interlocked.Increment की तुलना में निष्पादक अस्थिर है? वही? बेहतर? – jrista