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?