2014-09-23 21 views
7

..NET'de <code>MemoryMappedFile</code> s içinde kilitli belleklere karşı Kilitli İşlemler (CompareExchange, Increment vb.) Kullanmam gerekir.

Çok benzer bir soruyu bu answer buldum. Sorun, Kilitli İşlemlerin 64 bit işletim sistemi üzerindeki kernel32 (veya başka herhangi bir) dll'den dışa aktarılmamasıdır (bkz. Ör. http://blog.kalmbachnet.de/?postid=46).

64 bit .NET işleminde bir bellek bloğunda Kilitli işlevleri nasıl arayabileceğimin başka bir yolu var mı?

+1

Kilitli işlevleri çağrılan dışa aktarılmış işlevlerle kendi C Dll'imi yazmaya çalışıyorum ve .NET'ten PInvoke. –

+0

@AlexFarber Mükemmel nokta! Bu soruyu sormak için sadece utanıyordum :) Derleyici intrinsic Interlocked fonksiyonlarının ASM uygulamasını kolayca öğrenebilir miyim (örneğin [http://msdn.microsoft.com/en-us/library/2ddez55b(v = vs.80) .aspx] (http://msdn.microsoft.com/en-us/library/2ddez55b (v = vs.80) .aspx))? Bu yüzden ASM kodunu kendim yeniden icat etmek zorunda değilim. – Jan

+2

Bunu yapmanıza gerek yok, sadece yerel Dll'den gerekli işlevleri çağırın, derleyici gerisini halledecektir. İhtiyacınız olan her kilitli işlev için, Kilitli işlevini çağıran dışa aktarılmış Dll işlevini yazarım. –

cevap

1

Kendinize yönetilen kod tarafından tüketilebilir kilitli işlemler sağlayan küçük bir C++/CLI yardımcı kitaplığı yazın.

En hızlı birlikte çalışma yolunun, içsel olarak iç içe geçmiş içsel olarak kullanılmakta olan yönetilmeyen bir işleve çağıran yönetilen bir sınıfı ortaya çıkarmak olduğuna inanıyorum. Bu şekilde PInvoke'a gitmen bile gerekmiyor.

+0

Ne yazık ki bu doğru değil - C++/CLI, bastırılmış kontrollerle P/Invoke'den daha yavaş - bkz. Burada: http://www.codeproject.com/Articles/253444/PInvoke-Performance?msg=4551831#xx4551831xx veya burada: http://www.xinterop.com/index.php/2013/05/01/ccli- vs-pinvoke-performance-part-one/ Öyleyse P/Invoke gitmek için bir yoldur (ne yazık ki hala her arama başına bir düzineden fazla talimatlar reklamlar) – Jan

+0

İlk makale C++ sarmalayıcının daha hızlı olduğunu gösteriyor. 2. makalede C++ sarmalayıcı çok daha yavaştır, şüphelenmeye başladım. Belki optimizasyonlar açılmamış veya fazladan iş yapılmadı (aslında - C++ sarmalayıcı sadece bir orta sınıf aracılığıyla sqrt çağırır. Neden?). Her iki makalede kıyaslama süreleri çok küçüktü. Bir sürü gürültü. DateTime.Now da çok hassas değil. Normalde, 15 ms'lik adımlarla artar. Testleri 10-30 ms aralığındaydı. Her iki makaleye de güvenmiyorum ve daha fazla araştırmaya zaman ayırmayacağım. – usr

+0

Bulgularınıza katılıyorum. Ana nokta, maksimum hız istiyorsanız, yönetilen <-> yerel geçişler ile ilişkili tüm yığın izleme problamalarının üstesinden gelmeniz gerektiğidir. P/Invokes ile bunu SuppressUnmanagedCodeSecurity özniteliğini belirterek yapabilirsiniz. C++/CLI sarmalayıcı ile, tüm bu denetimi varsayılan olarak alırsınız ve bilgimi kısaltamazsınız. – Jan

İlgili konular