2011-05-08 22 views
5

Bir iş parçacığında değiştirilmekte olan ve bir muteks kullanılarak düzgün bir şekilde kilitlenen ve kilidi açılmış bir değişken, başka bir iş parçacığı içinde bir while döngüsünde okunuyorsa, bir mutlunun nasıl kilitlendiğini ve kilidini açacağını while döngüsü değeri okuyabilir, hatta gerekli midir?Bir mutex değişkeninin bir while döngüsünde işlenmesi

Bir iş parçacığında bir değişken ayarlıyorum ve bir while döngüsü kullanarak başka bir iş parçacığında kontrol ediyorum. While döngüsü koşulunu kontrol etmek için değişken nasıl kilitlenir ve kilidi açılır?

Bunu yapmanın tek mantıklı yolu, while döngüsünü çalıştırmak için kullanılan ek bir değişkene sahip olmak ve bunu kilitleme/kilit açma gerektiren değişkenin değerine ayarlamaktır.

+0

noktada şudur: Sonra

int valueOfSharedVariable() { int status; int result; status = pthread_mutex_lock(&mutex); assert(status == 0); result = sharedVariable; status = pthread_mutex_unlock(&mutex); assert(status == 0); return result; } 

sizin while -loop koşul aşağıdaki gibi yazılabilir, aşağıdaki kodda gösterildiği gibi Örneğin, fayda fonksiyonu yazılmış olabilir bir süreye ihtiyacın yok * 'Değişkeni kilitlemek' mümkün değildir, sadece kodu engellemek mümkündür. Bir kitap al, iş parçacığı canavarı seni canlı olarak yiyecek. –

cevap

5

Düzenleme: Kullandığınız eğer ninjalj önerisi şart değişkenin kullanımı ile -loop while yerine @ iyi tavsiye bir program devlet olmuştur kadar bekleyin while -loop için ulaştı. Eğer çalışıyorsun bir while -loop kullanıyorsanız Ancak, bir program devlet Bir Fayda fonksiyonunda "lock-mutex; examine variable; unlock mutex" kod kaydırmak ve gereken

sizin while -loop koşul yapabilirsiniz ... sonra ulaşılana kadar o zaman bu fonksiyonu çağır. Bir muteks

while (valueOfSharedVariable() < 10) { 
    ... 
} 
+0

Kullanılan iddia ne kadardır? – jarryd

+3

Çoğu pthread işlevi başarılı olursa 0 ve başarısız olursa bir çeşit hata kodu döndürür. Bir şeylerin yanlış gittiği ve muteksin düzgün bir şekilde elde edemediğini ya da bırakmayı başaramadığın iddiası var. – Brendan

+1

Bu "assert()" hemen hemen benim hineyimi kurtardı, çünkü benim muteksimi düzgün bir şekilde başlatmadığımın farkına varmamı sağladı! – MuffinTheMan

0

Aynı anda başka birinin yazdığı en ufak bir şans varsa, okunurken kilitlemeniz gerekir. Aksi takdirde, kısmi bir güncelleme veya hiç güncelleme görmediğiniz gibi her türlü şey olabilir.

Değeri döngü durumu olarak kullanırsanız ve döngü sırasında güncellemelerden etkilenmezse, bir kopyasını çıkartıp kilidi serbest bırakmak iyi bir fikir olabilir. Eğer bir değişiklikten etkilenecekseniz, elbette ki kilidi tutmalısınız.

4

Muhtemel bir koşul değişkeni kullanmalısınız. Bkz pthread_cond_wait(3) ve pthread_cond_signal(3)

İlgili konular