2011-10-11 13 views
7

Esiste un modo per utilizzare i metodi Interlocked.CompareExchange(); e Interlocked.Increment(); rispetto ai valori memorizzati in un file mappato in memoria?Come utilizzare le operazioni interbloccate su file mappati in memoria .Net

Vorrei implementare un servizio multi-threading che archivierà i suoi dati in un file mappato in memoria, ma dal momento che è multithreading ho bisogno di prevenire scritture in conflitto, quindi mi chiedo delle operazioni Interlocked piuttosto che usare serrature esplicite.

So che è possibile con codice nativo, ma può essere fatto in codice gestito su. NET 4.0?

+0

Anche cercando questo. Hai mai trovato una soluzione? – TravisWhidden

+0

Pubblicato una risposta qui sotto. Per favore accetta!!! :) Grazie. – TravisWhidden

risposta

6

OK, questo è come lo si fa! Abbiamo dovuto capirlo, e ho pensato che potremmo restituire lo stackoverflow!

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)); 
    } 
} 

Questo funziona e funziona su più processi! Goditi sempre una bella sfida!

+0

Sai qual è la soluzione corretta per x64? Poiché le funzioni intterlockate non vengono esportate dalla versione 64bit di kernel32.dll – Jan

+0

, non ho trovato una soluzione per x64, ma ci siamo imbattuti in alcuni mesi prima quando indirizzavano AnyCPU con sistema operativo a 64 bit. Tutte le idee sono ben accette! – TravisWhidden

+0

Perché non hai usato. Interblocco.Incremento? –

Problemi correlati