2012-10-22 11 views
5

Boost Mutex uygulamasının Boost boost::mutex eski sürümlerinde bildiğim kadarıyla, kritik bölümler kullanılarak gerçekleştirildi. Ancak Boost 1.51'in en yeni sürümünde, şimdi muteks uygulamasının Olayları temel aldığını keşfettim.Windows için

Bu değişimin ardındaki mantıklı şeyin ne olduğunu bilen var mı? Performans nedenleriyle yapıldı mı? Kritik bölümler kullanımdan kaldırılıyor mu?

+0

Güçlendirme kanallarına baktın mı? – PlasmaHH

+1

Görebildiğim kadarıyla, çeşitli mutekslerin tasarımını basitleştirmek ve birleştirmek için yapıldı: şu anda 'mutex', 'timed_mutex', try_mutex' - hepsi kullanılamayan 'detail :: basic_timed_mutex' kullanılarak gerçekleştirildi CS. (Aslında, CS kullanmak her zaman en iyi seçim değildir, eşzamanlılık senaryosuna bağlıdır, bu yüzden bunun için tasarımı zorlaştırmaya değmez.) –

+1

Sadece destek tasarımcılarının bunu tam olarak cevaplayabildiğini biliyorsunuz. Geri kalanımız sadece spekülasyon yapabilir ... – Tudor

cevap

5

boost kullanarak her zaman değişiklik olmadan en iyi yaklaşıma sahip olmak harika değil mi? boost'un yeni sürümünde, boost::mutex, bir kilitlenme kilidi olarak uygulanır, ancak yoğun bir beklemeden kaçınmak için bir pencere olayının yardımıyla ve bu olay yalnızca gerekirse oluşturulur, böylece çok hafiftir ve çok yüksek bir performansa sahiptir ve ayrıca boost zamanlanmış beklemek için bu hafif mutex kullanmak için! Bence bu mükemmel mi?

+0

Bu doğru olamaz, gerçek bir döndürme kilidi sadece çekirdek modunda kullanılabilir ... – Benj

+0

@Benj ve kim burada gerçek bir dönme kilidine ihtiyacımız olduğunu söyledi? 'Boost'un birçok parçası atomik değişkenler kullanılarak uygulanan spinlocka bağlıdır, örneğin' boost :: shared_ptr 've' boost :: detail :: spinlock 'uygulamalarına bir göz atın ve bu spinlockun performansını karşılaştıran küçük bir program yazın. Pencerelerde ve hatta * nix sistemlerinde uygulanan en hızlı kilit uygulaması ve bu sonucun harika olduğunu görüyorsunuz! – BigBoss

+2

Neredeyse doğru, ama aslında 'boost :: mutex 'spinlocks kullanmaz! Bir optimizasyon olarak atomik ops kullanır: kilidi alırken, ilk önce (atomik olarak) muteksin kilitli olup olmadığını söyleyen bir değişkeni kontrol eder. Kilitlenmezse, devam edebilir (win32 olayını hiç dikkate almadan), bu hızlı yoldur. Kontrol, muteksin kilitlendiğini söylese, o zaman (daha) pahalı olan win32 oyunu devreye girer. Ama burada hiç spinlock yok ;-) – Frunsi