2016-04-08 10 views
1

statik bir işlevi olan bir C++ sınıfı vardır. Yani başka bir iş parçacığı tarafından erişilemiyor.Statik işlev için bir muteks'e mi ihtiyacım var?</p> <pre><code>class Foo { public: static void bar(int &a) { a++; } } </code></pre> <p><strong>DÜZENLEME: değişken olarak kabul</strong><br> değişken çağrı kapsamında, sadece kullanılan

Bu işlevi ayrı bir iş parçacığından aradığımda mutex kullanmalı mıyım?

Teşekkürler.

+1

'a 'başka bir yerde nasıl kullanıldığına bağlıdır. Herhangi bir 'int' olabilir mi? Bir şey olursa, onu nasıl koruyorsunuz? Muhtemelen 'bar' çağırmadan önce kilidini kullanmanız gerekir. – Simple

+0

Bu işlevin nasıl kullanılacağına dair daha fazla bilgi sağlayamazsanız, cevap oldukça karmaşıktır. Fonksiyonun kendisinden ziyade korumaya ihtiyaç duyan bu işleve geçirilen değişkenlerdir. – Galik

+0

@Galik: İkinci cümleniniz ilkini onaylamaz, çünkü bu sorunun cevabı son derece basittir. –

cevap

8

Bu işlevin çağrılması yalnızca iş parçacığı yerel kaynakları, iş parçacığı yığını gerektirir. Bu nedenle cevap hayır. Int değişkeni arama iş parçacığından daha fazla erişilebilirse,

3

değişkeni için bir mutex'a ihtiyacınız olacaktır. Bir işlevin static'un çağrıların senkronize edilmesi gerekip gerekmediği konusunda herhangi bir etkisi yoktur.

Belirleyici faktör, işlevin yeniden giriş yapıp yapmayacağını ve verilerle yaptığınız şeydir. Bu durumda, , yeniden girişe girer (yerel olarak kendi başına bir durumu olmadığı veya aslında herhangi bir durum olmadığı için) ve veriler arama kapsamı tarafından sahiplenir/yönetilir, böylece Tamsayının koruma gerektirip gerektirmediğini arama kapsamına karar vermek.

Ancak bu, bar'un statik bir üye, statik olmayan bir üye, boş bir işlev, makro, bir kedi, kara delik veya Jon Skeet'in çamaşır kurutma makinesi olup olmadığı doğrudur.

+0

Sadece merak ediyorum. Neden ismini değiştirdin ve geri aldın? – SergeyA

+0

Biliyorum. Bir gecede çevrildiğini ima etmedi. Soru hala geçerli. – SergeyA

+0

Yeterince adil. Dediğim gibi, sadece meraklı olmak. – SergeyA

0

Muteks'in kullanılabilir olan tek iş parçacığı eşitleme ilkesi olmadığı ve çoğu senaryodan en uygun olan bazı senaryolarda bahsetmek isterim.

Sunulan senkronizasyon gereklidir (kullanıma bağlı olarak neden gerekebileceğine dair diğer iki cevaba bakın) muteks dünyasına atlama. Sayaç olarak (bu kodda gördüğüm gibi) atomik değişkenleri (veya atomik olmayan türler üzerinde atomik işlemlerin yokluğunda), daha iyi bir performans ve daha kolay bir kod sağlar. Bu özel durumda

, bir değişkenin değerini artırarak kolayca aşağıdaki evreli bir şekilde yapılabilir C++ 11 kod: Burada kullanılan

static void bar(std::atomic<int>& a) 
{ 
    a.fetch_add(1, std::memory_order_relaxed); 
} 

memory_order_relaxed gerçekten zoraki ve merdivenler geçerli değildir (Ancak, genellikle sayaçlar için iyi). Burada çoğunlukla örnek için kullanılır.

İlgili konular