2014-09-23 34 views
7

Tôi cần sử dụng các hoạt động liên khóa (CompareExchange, Increment, vv) đối với bộ nhớ trong MemoryMappedFile s trong .NET.Làm thế nào để sử dụng x64 Hoạt động khóa liên động với MemoryMappedFiles trong .net

Tôi đã tìm thấy điều này answer cho một câu hỏi rất giống nhau. Vấn đề là các hoạt động liên khóa không được xuất từ ​​tệp kernel32 (hoặc bất kỳ tệp nào khác) trên hệ điều hành 64 bit (xem ví dụ: http://blog.kalmbachnet.de/?postid=46).

Có cách nào khác để tôi có thể gọi các chức năng khóa liên động trên một khối bộ nhớ trong quá trình .NET 64 bit không?

+1

Tôi sẽ cố gắng viết Dll C của riêng tôi với các chức năng được xuất khẩu gọi các chức năng khóa liên động, và PInvoke nó từ .NET. –

+0

@AlexFarber Điểm Excelent! Tôi chỉ là goint để hỏi về điều này :) Bạn có xảy ra để biết nếu tôi có thể dễ dàng tìm hiểu ASM thực hiện các trình biên dịch nội tại các chức năng Interlocked (ví dụ như [http://msdn.microsoft.com/en-us/library/2ddez55b(v = vs.80) .aspx] (http://msdn.microsoft.com/en-us/library/2ddez55b (v = vs.80) .aspx))? Vì vậy, tôi không phải tự mình tái tạo mã ASM – Jan

+2

Bạn không cần phải làm điều này, chỉ cần gọi các hàm được yêu cầu từ Dll gốc, trình biên dịch sẽ làm phần còn lại. Ý tôi là, đối với mỗi chức năng khóa liên động mà bạn cần, hãy viết chức năng Dll được xuất khẩu có chức năng Interlocked. –

Trả lời

1

Viết cho mình một thư viện trợ giúp C++/CLI nhỏ cung cấp các hoạt động liên khóa tiêu thụ bởi mã được quản lý.

Tôi tin rằng đường dẫn interop nhanh nhất là để trưng ra một lớp được quản lý mà nội bộ gọi vào một chức năng không được quản lý mà chính nó sử dụng trên các nội tại lồng vào nhau. Bằng cách đó bạn thậm chí không phải đi qua PInvoke.

+0

Thật không may điều này không đúng - C++/CLI chậm hơn P/Gọi với các kiểm tra bị chặn - xem ví dụ tại đây: http://www.codeproject.com/Articles/253444/PInvoke-Performance?msg=4551831#xx4551831xx hoặc tại đây: http://www.xinterop.com/index.php/2013/05/01/ccli- Vì vậy, P/Gọi là con đường để đi (tiếc là nó vẫn quảng cáo trên một tá hướng dẫn cho mỗi cuộc gọi) – Jan

+0

Bài viết đầu tiên dường như cho thấy trình bao bọc C++ nhanh hơn. Trong bài viết thứ 2, trình bao bọc C++ chậm hơn rất nhiều nên tôi bắt đầu trở nên nghi ngờ. Có lẽ tối ưu hóa đã không được bật hoặc làm việc thêm được thực hiện (thực sự - C++ wrapper gọi sqrt chỉ thông qua một lớp trung gian. Tại sao?). Trong cả hai bài báo, thời gian chuẩn bị rất nhỏ. Quá ồn. DateTime.Now cũng không chính xác lắm. Thông thường, nó tăng theo các bước 15ms. Các bài kiểm tra của anh nằm trong khoảng 10-30ms. Tôi không tin tưởng một trong hai bài viết và tôi sẽ không đầu tư thời gian để điều tra thêm. – usr

+0

Tôi đồng ý với những phát hiện của bạn. Điểm chính là nếu bạn muốn tốc độ tối đa, bạn cần phải thay thế tất cả các dấu vết thăm dò vv liên quan đến quản lý <-> chuyển tiếp bản địa. với P/Invokes bạn có thể làm điều này bằng cách chỉ định thuộc tính SuppressUnmanagedCodeSecurity. Với trình bao bọc C++/CLI, bạn nhận được tất cả các kiểm tra đó theo mặc định và với kiến ​​thức của tôi, bạn không thể tắt chúng. – Jan

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