.NET

2011-10-11 19 views
7

मेमोरी-मैप की गई फ़ाइलों के विरुद्ध इंटरलाक्ड ऑपरेशंस का उपयोग कैसे करें Interlocked.CompareExchange(); और Interlocked.Increment(); मेमोरी-मैप किए गए फ़ाइल में संग्रहीत मानों के विरुद्ध विधियों का उपयोग करने का कोई तरीका है?.NET

मैं एक बहु-थ्रेडेड सेवा को कार्यान्वित करना चाहता हूं जो मेमोरी-मैप किए गए फ़ाइल में अपना डेटा संग्रहीत करेगा, लेकिन चूंकि यह बहु-थ्रेडेड है, इसलिए मुझे विवादित लेखन को रोकने की आवश्यकता है, इसलिए मैं इंटरलॉक ऑपरेशंस के उपयोग के बजाय आश्चर्यचकित हूं स्पष्ट ताले

मुझे पता है कि यह मूल कोड के साथ संभव है, लेकिन क्या यह .NET 4.0 पर प्रबंधित कोड में किया जा सकता है?

+0

इसके लिए भी खोज रहे हैं। क्या तुम्हें कभी कोई हल मिला? – TravisWhidden

+0

नीचे एक उत्तर पोस्ट किया गया। कृपया स्वीकार करो!!! :) धन्यवाद। – TravisWhidden

उत्तर

6

ठीक है, यह है कि आप इसे कैसे करते हैं! हमें इसे समझना पड़ा, और मुझे लगा कि हम कुछ वापस स्टैक ओवरफ्लो दे सकते हैं!

class Program 
{ 

    internal static class Win32Stuff 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     unsafe public static extern int InterlockedIncrement(int* lpAddend); 
    } 

    private static MemoryMappedFile _mmf; 
    private static MemoryMappedViewStream _mmvs; 

    unsafe static void Main(string[] args) 
    { 
     const int INT_OFFSET = 8; 

     _mmf = MemoryMappedFile.CreateOrOpen("SomeName", 1024); 

     // start at offset 8 (just for example) 
     _mmvs = _mmf.CreateViewStream(INT_OFFSET, 4); 

     // Gets the pointer to the MMF - we dont have to worry about it moving because its in shared memory 
     var ptr = _mmvs.SafeMemoryMappedViewHandle.DangerousGetHandle(); 

     // Its important to add the increment, because even though the view says it starts at an offset of 8, we found its actually the entire memory mapped file 
     var result = Win32Stuff.InterlockedIncrement((int*)(ptr + INT_OFFSET)); 
    } 
} 

यह काम करता है, और कई प्रक्रियाओं में काम करता है! हमेशा एक अच्छी चुनौती का आनंद लें!

+0

क्या आप जानते हैं कि x64 के लिए उचित समाधान क्या है? चूंकि intterlocked फ़ंक्शंस को kernel32.dll – Jan

+0

के 64 बिट संस्करण से निर्यात नहीं किया गया है, इसलिए मैं x64 के समाधान के साथ नहीं आया था, लेकिन 64 बिट ओएस के साथ एसीसीपीयू को लक्षित करते समय हमने कुछ महीनों पहले इसमें भाग लिया था। किसी भी विचार का स्वागत है! – TravisWhidden

+0

आपने .Net Interlocked.Increment का उपयोग क्यों नहीं किया? –