Çoğu örnekte, muteks'in global olduğu std::mutex
kullanarak gördüm. Bunun neden yapıldığının belli bir sebebi olduğunu merak ediyordum? Bunu yapmadığım kendi programlarım vardı ve muteks'i std::thread
std::ref
olarak geçirdim. Dünyada kötü bir uygulama yapmak kötü bir şey değil mi? Bunu yapmak için neden kısıtlayan bir dil yoksa, C++ 'da küresel std::mutexes
'un ardındaki mantıklı nedir?Herhangi bir neden C++ 11+ std :: mutex bir std :: thread işlev parametresi olarak geçirilen yerine global bir değişken olarak bildirilmelidir?
cevap
O olmadığında dışında globalsi olması kötü bir uygulamadır. Örneğin, std::cin
dünya çapındadır.
muteksler olursa olsun kullanılabilir hale nasıl bir anlamda geneldir. Farklı kod parçaları arasında paylaşılıyorlar. Böylece onları globals yapabilir, ya da onları kullanmayan fonksiyonlar aracılığıyla onları arama zincirinden geçirebilirsiniz. Bu "serseri veri" olarak bilinir ve aynı zamanda "kötü uygulama" dir. Zehirini seç.
Yan not: En azından veri parçalarını (muteksler, vb.) Tek bir nesneye bir araya getirerek en aza indirebilirsin; o zaman sadece bir argümanı çok değil, çağrı zincirinden geçmek zorundasınız. –
@JeremyFriesner - evet, kötü bir tasarımın uygulanmasını basitleştirmek için tutarsız türler oluşturabilirsiniz.
Bazı insanlar '
Büyük olasılıkla bu örnekte ziyade kesin özelliklerini odağı olmaya muteksin kendisinin kullanımına izin veren, takip etmek ömeği kolaylaştırmak için yapıldı.
Tipik bir mutex bir kaynak korur ve muteks kaynak yanında yaşaması için birçok durumda mantıklı. Örneğin, bir mutex tarafından korunması gereken bir üye konteynerine sahip bir sınıfınız varsa, mutex'i de sınıfın bir üyesi yapın. Daha sonra sınıf örneği birden fazla iş parçacığı tarafından harekete geçirildiğinde, üye-muteks, gerekli olan girişleri iç konteynere korumak için kullanılabilir.- 1. std :: unique_ptr parametresi olarak std :: thread
- 2. std :: copy_n neden std :: size_t yerine bir şablon parametresi alıyor?
- 3. std :: özel bir akış denetleyicisi olarak işlev
- 4. Std :: thread nasıl bir standarttır?
- 5. Neden std :: mutex, CRITICAL_SECTION
- 6. -std = C++ 11 ve -std = gnu ++ 11 arasındaki farklar nelerdir?
- 7. std :: mutex std :: cout için düzgün şekilde kilitlenmiyor
- 8. C++: Yinelenen türün bir işlev parametresi olarak nasıl iletileceği
- 9. C++ 11 std :: hash function nesne sınıfları thread safety
- 10. C++ 11: std :: function :: target()
- 11. C++ 11 varsayılan işlev argümanları olarak 11 lambdas
- 12. std :: thread - parçanizin isimlendirilmesi
- 13. std :: thread C++. Daha fazla konu aynı veriler
- 14. Neden std :: thread ile otomatik kullanamıyorum?
- 15. İşaretçi typedef neden std :: vector :: data()? std :: vektör API olarak
- 16. std :: thread nasıl sonlandırılır?
- 17. Kendisini ayırmak ve sonlandırmak için bir std :: thread alın
- 18. Android ndk'de C++ 11 std :: async
- 19. C++ 11 std :: vektör eşzamanlı ortamda
- 20. bir C++ std :: string
- 21. Neden "std :: initializer_list" bir literal tür olarak tanımlanmadı?
- 22. Neden GCC ve Clang'da std :: thread kullanımı için -pthread gerekli?
- 23. Operatörü, işlev şablon parametresi olarak değiştir
- 24. std :: this_thread * işlevlerini boost :: thread?
- 25. referans olarak nesneyi Geçme :: C++ 11
- 26. std :: array tamamlanmamış bir tür hatası ile std :: tuple
- 27. C++ 11 std :: shared_ptr + boost :: serileştirme
- 28. C++ bir const std :: string &?
- 29. C++ 11 std :: async Android'de NDK çalışmıyor
- 30. C++ 11: GCC 4.8 static thread_local std :: unique_ptr tanımsız başvuru
Nedeni yok. Muhtemelen örnekte kodu kesmek için yapıldı. – NathanOliver
Muhtemelen yazar 'std :: reference_wrapper' ın sözdiziminden nefret ettiği için;) –
Tamamen bağlıdır. Oldukça önemsiz programlar mı? Birden fazla dosyadan mı oluşuyorlar? Daha fazla bilgiye ihtiyacınız var. Genellikle globals kötü uygulama olarak kabul edilir ve kaçınılmalıdır. Genellikle, mutekslerim sınıf üyesi değişkenler olma eğilimindedir. Kilitlemeyi gerektiren nesneye koymak genellikle doğaldır. – Galik