2011-10-11 26 views
7

Có cách nào để sử dụng các phương thức Interlocked.CompareExchange();Interlocked.Increment(); so với các giá trị được lưu trữ trong tệp ánh xạ bộ nhớ không?Cách sử dụng các hoạt động liên khóa với các tệp ánh xạ bộ nhớ trong .Net

Tôi muốn triển khai dịch vụ đa luồng sẽ lưu trữ dữ liệu trong tệp được ánh xạ bộ nhớ, nhưng vì đa luồng, tôi cần phải ngăn việc ghi xung đột nên tôi tự hỏi về các hoạt động được liên kết thay vì sử dụng khóa rõ ràng.

Tôi biết có thể với mã gốc, nhưng nó có thể được thực hiện trong mã được quản lý trên .NET 4.0 không?

+0

Cũng đang tìm kiếm điều này. Bạn đã bao giờ tìm thấy một giải pháp? – TravisWhidden

+0

Đăng câu trả lời bên dưới. Xin vui lòng chấp nhận !!! :) Cảm ơn. – TravisWhidden

Trả lời

6

OK, đây là cách bạn thực hiện! Chúng tôi đã phải tìm ra điều này, và tôi đã hình dung rằng chúng tôi có thể trả lại cho 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)); 
    } 
} 

Tính năng này hoạt động và hoạt động trên nhiều quy trình! Luôn luôn tận hưởng một thử thách tốt!

+0

Bạn có biết giải pháp thích hợp cho x64 là gì không? Khi chức năng intterlocked không được xuất từ ​​phiên bản 64bit của kernel32.dll – Jan

+0

Tôi đã không đưa ra một giải pháp cho x64, nhưng chúng tôi đã chạy vào đó một vài tháng trở lại khi nhắm mục tiêu AnyCPU với hệ điều hành 64bit. Bất kỳ ý tưởng được hoan nghênh! – TravisWhidden

+0

Tại sao bạn không sử dụng .Net Interlocked.Increment? –

Các vấn đề liên quan