Koşul değişkenlerinin uygulanma (veya başlangıçta) şekli budur.
Muteks, koşul değişkeninin kendisini korumak için kullanılır . Bu yüzden beklemeden önce kilitli olmanız gerekiyor.
Bekleme, muteksin "atomik olarak" kilidini açarak diğerlerinin koşul değişkenine erişmesini sağlar (sinyal için). Daha sonra koşul değişkeni sinyal verildiğinde veya yayınlandığında, bekleme listesindeki bir veya daha fazla iş parçacığı uyandırılacak ve muteks o iş parçacığı için yeniden sihirli bir şekilde kilitlenecektir.
Genellikle, nasıl çalıştığını gösteren koşul değişkenleriyle aşağıdaki işlemi görürsünüz. Aşağıdaki örnek, bir koşul değişkenine bir sinyal yoluyla iş verilen bir işçi iş parçacığıdır.
thread:
initialise.
lock mutex.
while thread not told to stop working:
wait on condvar using mutex.
if work is available to be done:
do the work.
unlock mutex.
clean up.
exit thread.
Bekleme döndüğünde kullanılabilir olan bazı durumlar varsa, iş bu döngü içinde yapılır. İş parçacığı iş yapmayı durdurmak için işaretlendiğinde (genellikle başka bir iş parçacığı tarafından çıkış koşulunu ayarlayıp daha sonra bu değişkeni uyandırmak için koşul değişkenini tekmelemek), döngü çıkacak, muteksin kilidi açılacak ve bu iş parçacığı çıkacaktır.
Yukarıdaki kod tek tüketici modelidir, çünkü iş yapılırken muteks kilitli kalır. Çok tüketicili bir varyasyon için örnek olarak şunları kullanabilirsiniz :
thread:
initialise.
lock mutex.
while thread not told to stop working:
wait on condvar using mutex.
if work is available to be done:
copy work to thread local storage.
unlock mutex.
do the work.
lock mutex.
unlock mutex.
clean up.
exit thread.
bu da diğer tüketicilerin iş yaparken iş almasını sağlar.
Condition değişkeni, bir şeyin gerçekleşmesi gerektiğinde başka bir iş parçacığının sizi bilgilendirmesine izin vermek yerine bazı koşulları yoklama yükünü ortadan kaldırır. Başka bir iş parçacığı, iş parçacığının aşağıdaki gibi kullanılabilir olduğunu söyleyebilir:
lock mutex.
flag work as available.
signal condition variable.
unlock mutex.
Genellikle yanlış uyandırma olarak adlandırılanların büyük çoğunluğu genellikle her zaman pthread_cond_wait
çağrılarında (yayın) birden çok iş parçacığının sinyal verilmiş olması , bir kişinin muteks ile geri dönmesi, işi yapması ve tekrar beklemesi idi.
Daha sonra yapılacak iş olmadığında, sinyal verilen ikinci iplik ortaya çıkabilir. Bu yüzden, işin yapılması gerektiğini belirten ekstra bir değişkeniniz olması gerekiyordu (bu, burada condvar / mutex çifti ile doğal olarak muteks korumalıydı - ancak muteksi değiştirmeden önce kilitlemek için diğer dişler).
O was bir iş parçacığı başka bir işlem tarafından tekme olmadan bir koşul bekleyin dönmek için Pthreads üzerinde çalışıyor, hem gelişiminde / kod servis ve bir kullanıcı olarak tüm benim yıllardır, (bu gerçek bir sahte uyandırma) ama teknik olarak mümkün bunlardan hiç birini almadım. Belki de bunun nedeni HP'nin iyi bir uygulaması olmasıydı :-)
Her halükarda, hatalı davayı işleyen aynı kod, orijinal sahte uyandırma işlemlerini de gerçekleştirdi, çünkü bunlar için kullanılabilir bayrak ayarlanmayacaktı.