2010-03-27 11 views
15

Bir koşul değişkeni kullanmanın tipik yolu:Kontrol edilen değeri atomik olarak değiştiriyorsanız durum değişkenlerinin hala bir muteks'e ihtiyacı var mı?

// The reader(s) 
lock(some_mutex); 
if(protected_by_mutex_var != desired_value) 
    some_condition.wait(some_mutex); 
unlock(some_mutex); 

// The writer 
lock(some_mutex); 
protected_by_mutex_var = desired_value; 
unlock(some_mutex); 
some_condition.notify_all(); 

Ancak korumalı_by_mutex_var, atomik olarak bir karşılaştırma ve takas talimatı ile ayarlanmışsa, muteks herhangi bir amaca hizmet eder (pthreads ve diğer API'ler dışında) bir mutekste geçmenizi gerektirir)? Durumu uygulamak için kullanılan devleti koruyor mu? Değilse, bunu yapmak güvenli midir ?:

// The writer 
atomic_set(protected_by_mutex_var, desired_value); 
some_condition.notify_all(); 

Yazar asla okuyucunun muteksi ile doğrudan etkileşime girmiyor mu? 'Protected_by_mutex_var' adının artık gerçekten uygun olmadığını unutmayın (artık mutex korumalı değil). Eğer öyleyse, farklı okuyucuların aynı muteksleri kullanması bile gerekli midir?

+1

durum değişkenlerinin bütün mesele onlar nesnenin kilidini, yüklemi kontrol" yapmalarıdır ve yapar kullanma

uyu atomik. –

cevap

14

Aşağıdaki senaryoyu düşünün:

| Thread 1           | Thread 2           | 
| if(protected_by_mutex_var != desired_value) -> true |             | 
|              | atomic_set(protected_by_mutex_var, desired_value); | 
|              | some_condition.notify_all();      | 
| some_condition.wait(some_mutex);     |             | 

Bu durum olduğunu asla gelmeyebilir bildirmek için bekleyen parçacığı 1 görür. Durumda hareket eden ifadeler okuma/atomik kümesinin bir parçası olmadığından, bu bir yarış durumu sunar. muteks etkin bir ayrılamaz bu işlemler (bütün muteksi düzgün davranırlar ve kilitlemek değişkene erişir varsayarak.)

+0

Elbette: p Koşulların beklenmesi yoklama gibi davranmıyor(). –

+0

* "Durumda hareket eden ifadeler okuma/atom kümesinin değişkeninin bir parçası olmadığından, bu bir yarış durumu sunar." * Bu ifadeyi tekrar ayrıntılı olarak açıklar mısınız? –

+0

@Anisha Kaul: Okuyucu kodunu şimdilik düşünelim. Bu durumda, koşulda hareket eden ifade "some_condition.wait (some_mutex)" şeklindedir ve okunan değişken "if (protected_by_mutex_var! = Required_value)" içinde gerçekleşir. Söylemeye çalıştığım tek şey şu ki, hiçbir şey, bu iki operasyon arasında başka bir iş parçacığının ara vermeyeceğini garanti etmez - "birlikte"/"atomik" değiller; ya da daha önce koyduğum gibi, bekleyiş, okunan değişkenin "parçası" değildir. Benzer şekilde, yazar iş parçacığı için atomic_set çağrısı ve some_condition.notify_all() çağrısı için. –

İlgili konular