2016-03-21 21 views
0

boost::statechart::state_machine ile çalışıyorum ve makinede bir çökme yaşadım. Çekirdeğin araştırılması üzerine bunun gerçekleştiğini fark ettim çünkü birden fazla iş parçacığı aynı anda bir olay işledi, bunlardan biri sonlandı ve diğeri de sonlandırılmış bir nesneyi kullanmaya çalıştığı için çöktü.Artış yapmamın en kolay yolu nedir :: statechart :: state_machine thread-safe?

Bu nedenle, durumlarımın makineye göre güvenliğini sağlamak için seçeneklerimin ne olduğunu bilmem gerekiyor. Boost'un statecharddocumentation'a bakıldığında, statechart::state_machine'un diş güvenli olmadığını ve iplik güvenliğinin aynchronous_state_machine tarafından gerçekleştirilebileceğini açıkça belirtir. Ancak asynchronous_state_machine, sadece iş parçacığı emniyetinden daha fazla sorun çözüyor ve state_machine'dan asynchronous_state_machine'a önemsiz gözüküyor. Sadece process_event çağrılarımın etrafına kilitlenerek iş parçacığı güvenli bir uygulama yapabilir miyim?

+3

Açık şekilde iş parçacığı kaydetmeyen veya değişmez olmayan tüm paylaşılan nesnelerin etrafında kilit kullanarak iş parçacığı güvenliği sağlamalısınız. Bu önemsiz değildir ve yarış koşullarıyla dolu eski bir kod tabanınız varsa, bir sorunla karşılaşırsınız. [Bunu daha kolay hale getirmenin yolları vardır] (http://clang.llvm.org/docs/ThreadSafetyAnalysis.html), ancak kullandığınız platforma bağlıdır. Yani cevap * "Evet, ama zor" *. – nwp

+0

@nwp: Aslında bunu yapıyorum. Ben statechart :: state_machine miras aldım ve ilk kilitleri kendi temel işlevini çağıran kendi kendi başarımızı uygulayarak tüm kamu işlevlerini maskeledik. state_machine'in işlevleri sanal değildir, bu yüzden teknik olarak onları geçersiz kılmazlar, ancak onları maskelemekte ve kullanımımız polimorfik değildir.Bildiğim kadarıyla bu bize ihtiyacımız olan şeyi almalı. – firebush

cevap

0

Muteks semaforlarına veya kilitlerine bir alternatif olarak, bir monitörü düşünebilirsiniz.

  • Durum makinesi, şimdi sahip olduğunuz gibi olabilir.

Bildiğim birkaç tür var ve benim kendi tasarımım (güçlendirmek için değil) için bir Hoare Monitor kullanıyordum.

wiki-Vikipedi itibaren

: "eşzamanlı programlamada, bir monitör ipler karşılıklı dışlama ve gerçek olmaya belirli durum için (blok) beklemek kapasitesine sahipler sağlayan bir senkronizasyon yapıdır"

Benim Bir Hoare Monitörünün uygulanması, herhangi bir olayı (durum makinem için giriş) monitörün IPC mesajına dönüştürdü. Sadece monitör dişi durum makinesini değiştirir. Bu makine (ve tüm durumları), monitör dizisini ve yöntemlerini içeren sınıfa özel verilerdir.

Bazı güncellemeler eşzamanlı olmalıdır, yani bir IPC yanıtı alana kadar istekte bulunan bir ileti askıya alınmalıdır. Bazı güncellemeler eşzamansız olabilir, bu nedenle istekte bulunan iş parçacığının beklemesine gerek yoktur. Bir iş parçacığı isteğini işlerken, monitör diğer iş parçacığı isteklerini yoksayar, istekleri monitöre erişinceye kadar sıraya konur.

Yalnızca 1 iş parçacığının (özel veri özniteliği) durum makinesini doğrudan değiştirmesine izin verildiğinden, başka bir muteks şemasına gerek yoktur. Bu çaba bir telekomünikasyon cihazı için yapılmıştı ve olaylar çoğunlukla insan eylemlerinden kaynaklanıyordu, çünkü zaman kritik değil.


Durum makinesi, şimdi sahip olduğunuz gibi olabilir. Sadece monitör ipliği uygulamanız, bir IPC'ye (ya da belki de arası-iş parçacığına) karar vermeniz ve yalnızca bir iş parçacığının durum makinesine erişebilmesini sağlamanız gerekir.

İlgili konular