pthread_cond_wait必須放在pthread_mutex_lock和pthread_mutex_unlock之間,,因?yàn)樗鶕?jù)共享變
量的狀態(tài)來(lái)覺(jué)得是否要等待,而為了不永遠(yuǎn)等待下去所以必須要在lock/unlock隊(duì)中 共享變量的狀態(tài)改變必須遵守lock/unlock的規(guī)則 pthread_cond_signal即可以放在pthread_mutex_lock和pthread_mutex_unlock之間,,也可以放在 pthread_mutex_lock和pthread_mutex_unlock之后,,但是各有有缺點(diǎn)。 之間: pthread_mutex_lock xxxxxxx pthread_cond_signal pthread_mutex_unlock 缺點(diǎn):在某下線程的實(shí)現(xiàn)中,,會(huì)造成等待線程從內(nèi)核中喚醒(由于cond_signal)然后又回到內(nèi)核空間(因?yàn)閏ond_wait返回后會(huì)有原子加鎖的 行為),,所以一來(lái)一回會(huì)有性能的問(wèn)題。但是在LinuxThreads或者NPTL里面,,就不會(huì)有這個(gè)問(wèn)題,,因?yàn)樵贚inux 線程中,有兩個(gè)隊(duì)列,,分別是cond_wait隊(duì)列和mutex_lock隊(duì)列,, cond_signal只是讓線程從cond_wait隊(duì)列移到mutex_lock隊(duì)列,而不用返回到用戶空間,,不會(huì)有性能的損耗,。 所以在Linux中推薦使用這種模式。 之后: pthread_mutex_lock xxxxxxx pthread_mutex_unlock pthread_cond_signal 優(yōu)點(diǎn):不會(huì)出現(xiàn)之前說(shuō)的那個(gè)潛在的性能損耗,,因?yàn)樵趕ignal之前就已經(jīng)釋放鎖了 缺點(diǎn):如果unlock和signal之前,,有個(gè)低優(yōu)先級(jí)的線程正在mutex上等待的話,那么這個(gè)低優(yōu)先級(jí)的線程就會(huì)搶占高優(yōu)先級(jí)的線程 (cond_wait的線程),,而這在上面的放中間的模式下是不會(huì)出現(xiàn)的,。 所以,在Linux下最好pthread_cond_signal放中間,,但從編程規(guī)則上說(shuō),,其他兩種都可以 |
|