SORU
28 Aralık 2010, Salı


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
31 Aralık 2010, Cuma


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).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 趣味そうこ♪

    趣味そう

    3 Mart 2010
  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013
  • Sali Kaceli

    Sali Kaceli

    24 ŞUBAT 2009