2015-02-17 18 views
8

std :: mutex'in iki katı kadar kritik bölümlerle gerçekleştirilir, bu nedenle OS Mutex'ten (Windows'taki) çok daha hızlıdır. Ancak, Windows CRITICAL_SECTION kadar hızlı değil.Neden std :: mutex, CRITICAL_SECTION

Zamanlamaları tek iplik sadece dar bir döngü:

423.76ns ATL CMutex 
41.74ns std::mutex 
16.61ns win32 Critical Section 

Sorum muteks yapıyor std başka ne olduğu ::? Kaynağa baktım ama takip edemedim. Bununla birlikte, Crit Sec'e geçmeden önce fazladan adımlar vardı. Sorularım: faydalı olan bu ek adımlar nelerdir? Yani, ekstra adımlar nelerdir; CRITICAL_SECTION kullanarak ne kaçırırdım?

Ayrıca bir Mutex ile uygulanmadıysa, buna neden Mutex adını verdiler?

+4

Zamanlama nedir? Bir muteks yaratmak, kilitlemek, kilidini açmak, ... Win32 muteksinden farklara kadar: bir Win32 muteks çapraz işlem muteksidir. Standart sadece daha hafif bir yapıya sahip olabilen bir çapraz-iplik muteksini çağırır (ve Windows kritik bir bölüm ile çalışır). –

+1

CMutex bir muteks ile uygulandı, ucuz değil. std :: mutex, Eşzamanlılık Çalışma Zamanı'nın üzerine kurulmuş, işletim sistemi tarafından sağlanan iş parçacığı ve programlama ilkellerinin ötesinde önemli ölçüde genişleyen işlevselliği olan oldukça kodlu bir koddur. Katmanlama ağırdır, bu da bedavaya gelmez. Bir critsect amacına hizmet ederse ve ek yük gerçekten önemli ise o zaman problemi çöz ve kullan. –

+1

Zamanlama sadece kilitleme/kilit açma. Ben sadece std :: mutex'in kriterin ötesine geçtiğini merak ediyorum. Eğer yararlıysa o zaman istememeliyim? Eğer işe yaramıyorsa, neden bunu yapıyor? Sanırım std :: mutex kullanacağım, ama sadece ne yaptığını merak ediyorum. – Philip

cevap

3

std :: mutex, özyinelemesiz sahiplik semantiği sağlar. Bir CRITICAL_SECTION, yinelemeli semantik sağlar. Bu yüzden std :: mutex uygulamasındaki ekstra katmanın bu farkı çözmek için (en azından kısmen) olduğunu farz ediyorum.

Güncelleme: Kodun içine adım atması, std :: mutex'in klasik Win32 CRITICAL_SECTION yerine bir sıra ve InterlockedX yönergeleriyle uygulandığı görünmektedir. Std :: mutex yinelemesiz olsa da, RTL'deki temel kod isteğe bağlı olarak yinelemeli ve hatta zamanlanmış kilitleri işleyebilir.

+0

Bu, std :: recusive_mutex'in testlerimdeki daha hızlı tha std :: mutex olmaması dışında makul görünüyor. Hangi ikisi de, onları yavaşlatıp döndürmemek için ortogonal olan, onları yavaşlatmak için bir şeyler yaptıklarını gösteriyor, değil mi? – Philip

+4

Ub, bir 'std :: mutex' öğesini yinelemeli olarak kilitlemeyi denediğinden, "farkı çözümlemek" için neden kod gerekeceğini anlamıyorum. –

+0

Belki de UB'yi tespit etmek için hata ayıklama kodu mu? Zamanlama serbest bırakma veya hata ayıklama kullanılarak yapıldı mı? –