Ç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.
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