2017-07-05 98 views
5

Ç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::threadstd::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?

+8

Nedeni yok. Muhtemelen örnekte kodu kesmek için yapıldı. – NathanOliver

+0

Muhtemelen yazar 'std :: reference_wrapper' ın sözdiziminden nefret ettiği için;) –

+1

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

cevap

4

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

+0

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

+0

@JeremyFriesner - evet, kötü bir tasarımın uygulanmasını basitleştirmek için tutarsız türler oluşturabilirsiniz. Cidden, bununla birlikte, bu yasal bir teknik olabilir. Bahsettiğin için teşekkürler. –

+0

Bazı insanlar ''''da küresel hakkında eleştirilere sahiptirler. Bu, 'std'de bu şekilde yapıldığından değil, doğru yol olduğu için. – Jarod42

0

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.