2012-11-16 10 views
5

dikkatle takip SO soruya kabul cevabını okumakta olan:Bir semaforun koşullu/muteks uygulaması neden "wait()" işlevinde "while" döngüsü gerektiriyor?

void wait() 
{ 
    boost::mutex::scoped_lock lock(mutex_); 
    while(!count_) 
     condition_.wait(lock); 
    --count_; 
} 

ben anlamaya çalışıyorum: Bu cevap semafor uygulamada C++0x has no semaphores? How to synchronize threads?

, burada wait() fonksiyonun uygulamasıdır while(!count_) koşulunun amacı.

başka SO soru (How does this implementation of semaphore work?) cevabı gösterir notify_one() o koşul değişkeni bekleyen BİRDEN FAZLA iplik uyandı olacağını mümkün olduğunu, koşul değişkeni çağrıldığında - dolayısıyla ihtiyaç while döngü. Bunu doğrulamak istiyorum - bu tam ve/veya doğru cevap mı, yoksa while döngüsünün neden gerekli olduğunun başka nedenleri var mı?

Birden fazla iş parçacığı uyanırsa, hangi iş parçacığı muteksin sahibidir? Bu konuda daha fazla düşünürsem, daha fazla tanımlanmış olan tek bir çağrının notify_one()'a tek bir çağrıdan dolayı uyanabilmesi gibi görünüyor. İKİ uyandı ipliklerin 0 daha yüksek olduğu count_ değer olması ve daha kısa 0 bir count_ değeri elde edilir ve Semafora amacı (ve doğruluğunu) yenerek count_ azaltma devam etmek mümkün olmaz?

cevap

3

spurious wakeups veya notify_one olabilir, daha önce belirttiğiniz gibi uygulama ayrıntıları nedeniyle birden fazla iş parçacığı uyanabilir.

Birden çok iş parçacığı uyandırmak, tümünün korunan bölüme aynı anda girebileceği anlamına gelmez, sadece ThreadA kilidi serbest bıraktığında, ThreadB (önceki örnekte ThreadA ile birlikte uyandırılır) anlamına gelir) ayrıca korunan bölüme girer. Bu zamana kadar ThreadA zaten işini yaptı, bu yüzden ThreadB, ThreadA'nın bulduğu ile aynı durumda count değişkenini görmeyecek.

İlgili konular