2011-10-11 20 views
7

Bellek eşlemeli bir dosyada saklanan değerlerle Interlocked.CompareExchange(); ve Interlocked.Increment(); yöntemlerini kullanmanın bir yolu var mı?Bellek eşlemeli dosyalara karşı kilitli işlemler nasıl kullanılır. Net

Verilerini bellek eşlemeli bir dosyada depolayacak çok iş parçacıklı bir hizmet uygulamak istiyorum, ancak çok iş parçacıklı olduğundan, çakışan yazışmaları engellemeliyim, bu nedenle, kullanım yerine Kilitli işlemler hakkında merak ediyorum. açık kilitler.

Yerel kodla mümkün olduğunu biliyorum, ancak .NET 4.0'da yönetilen kodda yapılabilir mi?

+0

Ayrıca bunu arıyorum. Herhangi bir çözüm bulabildin mi? – TravisWhidden

+0

Aşağıda bir cevap gönderildi. Lütfen kabul et!!! :) Teşekkürler. – TravisWhidden

cevap

6

Tamam, işte böyle yapıyorsunuz! Bunu anlamaya ihtiyacımız vardı ve ben de yığın akışına geri verebileceğimizi düşündüm!

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

Bu, işe yarar ve birden çok işlem üzerinde çalışır! Her zaman iyi bir mücadelenin tadını çıkarın!

+0

x64 için uygun çözümün ne olduğunu biliyor musunuz? Kernel32.dll – Jan

+0

64bit sürümünden dahili işlevler dışa aktarılmadığı için x64 için bir çözüm bulmuyorum, ancak 64bit işletim sistemi ile AnyCPU'yu hedeflerken bunu birkaç ay içinde gerçekleştirdik. Herhangi bir fikir açığız! – TravisWhidden

+0

Neden .Net Interlocked.Increment'i kullanmadınız? –