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 statechard
documentation'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?
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
@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