2011-10-11 6 views
7

메모리 매핑 파일에 저장된 값에 대해 Interlocked.CompareExchange();Interlocked.Increment(); 메서드를 사용할 수 있습니까?.Net의 메모리 매핑 파일에 대해 연동 연산을 사용하는 방법

메모리 매핑 된 파일에 데이터를 저장하는 다중 스레드 서비스를 구현하고 싶습니다.하지만 다중 스레드이므로 충돌하는 쓰기를 방지해야하므로 사용보다는 연동 작동에 대해 궁금합니다. 명시 적 잠금.

네이티브 코드가 가능하다는 것을 알고 있지만 .NET 4.0의 관리되는 코드에서 수행 할 수 있습니까?

+0

이 또한 찾고 있습니다. 혹시 해결책을 찾았습니까? – TravisWhidden

+0

아래에 답변을 게시하셨습니다. 받아주세요!!! :) 감사. – TravisWhidden

답변

6

좋아요, 어떻게 할 수 있습니까? 우리는 이것을 알아야했고, 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)); 
    } 
} 

이것은 작동하며 여러 프로세스에서 작동합니다. 항상 좋은 도전을 즐기십시오!

+0

x64에 적합한 솔루션이 무엇인지 알고 있습니까? intterlocked 함수는 kernel32.dll – Jan

+0

의 64 비트 버전에서 내 보내지 않았기 때문에 x64 용 솔루션을 찾지 못했지만 64 비트 OS로 AnyCPU를 타겟팅 할 때 몇 달 전으로 돌아갔습니다. 어떤 아이디어라도 환영합니다! – TravisWhidden

+0

왜 .Net Interlocked.Increment를 사용하지 않았습니까? –