2011-03-03 15 views
5

Bazı koşul değişkenlerinin "cond", muteks değişkeni "mutex" ile ilişkilendirildiğini varsayalım. pthread_cond_wait(&cond,&mutex) arandığında cond'da bir iş parçacığı uyuyorsa ve mutex kilitli başka bir iş parçacığı bittiğinde, iş parçacığının pthread_cond_signal(&cond) numaralı telefonu arayarak pthread_mutex_unlock(&mutex) numaralı telefonu arayabilmesinden mi veya sonra mı aradığı fark eder mi? Eğer uyku ipliği muteks kazanırsa, pthread_cond_signal(&cond)'u çağırırsa muteksin kilidini açmaya bile gerek duyuyor mu?Bir koşul değişkeninin işaretlenmesi (pthreads)

DÜZENLEME: https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview'a göre, "pthread_cond_signal() çağrıldıktan sonra muteksin kilidini açmamak, eşleşen bir pthread_cond_wait() rutininin tamamlanmasına izin vermeyebilir (engellenir)." Sanırım o zaman, kilidin açılması ve belki de sonradan yapılması gerekiyor.

+0

+1. –

cevap

3

pthread_cond_signal numaralı telefonu arayarak muteks kilidini her zaman açmalısınız.

Calling pthread_cond_signal without locking mutex

Şu an bana gelmeyecek, ama don'(ırk koşulları açısından) iyi bir sebebi vardır eminim: İşte bazı güzel sorular/cevaplar okumak için Sinyal vermeden önce muteksin kilidini açmak istiyorum.

+0

Koşul değişkenine sinyal verdikten ve muteksin kilidini açtıktan sonra, iş parçacığı derhal 'pthread_mutex_lock() 'öğesini bu mutekste çağırırsa, pthread_cond_signal()' tarafından daha önce uyandıran konuları aç bırakmama garantilidir? – ManRow

+1

@ManRow: Doğru öncelikler ayarlanmışsa Öncelikli Zamanlama seçeneğinde böyle bir garanti olabilir. Aksi halde, kesinlikle değil. –

+2

Bunun nedeni, http://group.google.com/group/comp.programming.threads/msg/a3721a2fc9b21c64?hl=ky http://stackoverflow.com/questions/4544234/calling adresinden bağlantılandırılmıştır: pthread-koşul-sinyal olmaksızın kilitleme-Muteksleri/4544494 # 4544494 – ninjalj

4

Eğer muteks kilitli kalırsa, o zaman uyandıran iş parçacığı muteks elde edemez, bu yüzden pthread_cond_wait muteksine yeniden girmek için beklemeyi engeller.

pthread_cond_signal numaralı telefonu aramak için mutex'i kilitli tutmanız gerekmez. Aslında, eğer uygulama mantığınız muteks kilitlenmediğinde bir sinyal ile çalışabilirse o zaman bunu yapmak için daha iyi bir yoldur --- işletim sistemi hemen bekleyen ipliği programlayabilir ve sinyalin beklemesine gerek yoktur. Devam etmeden önce muteksin kilidini açmak için Bununla birlikte, bu senaryoda uyandığın kaybolmadığından ve "yanlış" iş parçacığı ile ilgili bir sorun yaşamanız için dikkatli olunmalıdır. Düz ileri bir yüklem kullanırsanız, bu pratikte bir sorun olmamalıdır. Kendi sorunuzu cevaplamak için