Arama dışlama kilitlemeden pthread_cond_signal
Kilidi gerektiğini okumuştumzaman uyumuaramadan öncepthread_cond_signalve sonra arama: mutext kilidini
() Pthread_cond_signal rutin. (veya uyandırmak) başka bir sinyal için kullanılan üzerinde bekleyen iş parçacığı durum değişken. Olmalı zaman uyumu kilitli, ve sonra aradı zaman uyumu için kilidini () pthread_cond_wait rutin tamamlayın.
Benim soru: bu çağrı için TAMAM değilpthread_cond_signalyapthread_cond_broadcastzaman uyumu kilitlemeden yöntemleri?
CEVAP
Eğer durum sinyalleri değiştiren codepath içinde karşılıklı dışlama kilit yaparsanız, wakeups kaybedebilir. İşlemler: bu çifti düşünün
Bir Süreç:
pthread_mutex_lock(&mutex);
while (condition == FALSE)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
B (yanlış) işlem:
condition = TRUE;
pthread_cond_signal(&cond);
Düşünün condition
FALSE
olarak başlar nerede talimatlar, bu mümkün araya girme sonra:
Process A Process B
pthread_mutex_lock(&mutex);
while (condition == FALSE)
condition = TRUE;
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
condition
şimdi durum değişken uyandırma sinyali bekleyen cevapsız kalmış Bir TRUE
ama işlemdir. Süreç B zaman uyumu kilitlememiz değiştirmek:
B (doğru) süreci:
pthread_mutex_lock(&mutex);
condition = TRUE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
...sonra yukarıdaki gerçekleştirilemiyor, uyandırma cevapsız asla.
(Notolabiliraslında taşı pthread_cond_signal()
kendisi sonra pthread_mutex_unlock()
, ama bu neden olabilir daha iyi planlama konuları ve ... mutlaka kilitli, zaman uyumu zaten bu kod yolu olması nedeniyle değişen durumu kendisi).
Visual Studio içinde arama dosya türle...
Vim/Vı komut arama vurgulayın sonuna i...
Java geri arama işlevleri...
Nasıl bir dosya çok satırlı bir desen ...
Lambda fonksiyonu Python özyinelemeli ...