互斥鎖:pthread_mutex_t ,為了使不同線程互斥的使用某個資源,。 條件鎖:pthread_mutex_t, 為了保證不同線程之間有順序(通過條件控制)地完成某個流程。 互斥鎖比較簡單,,也可以單獨(dú)使用,。 對于條件鎖,,通常配合一個互斥鎖一起使用,,以防止多個線程同時請求pthread_cond_wait()。 1. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) 等待條件有兩種方式:無條件等待pthread_cond_wait()和計時等待pthread_cond_timedwait(),,其中計時等待方式如果在給定時刻前條件沒有滿足,,則返回ETIMEOUT,結(jié)束等待,,其中abstime以與time()系統(tǒng)調(diào)用相同意義的絕對時間形式出現(xiàn),,0表示格林尼治時間1970年1月1日0時0分0秒。 無論哪種等待方式,,都必須和一個互斥鎖配合,,以防止多個線程同時請求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的競爭條件(Race Condition),。mutex互斥鎖在調(diào)用pthread_cond_wait()前必須由本線程加鎖(pthread_mutex_lock()),,而在更新條件等待隊列以前,mutex保持鎖定狀態(tài),,并在線程掛起進(jìn)入等待前解鎖,。在條件滿足從而離開pthread_cond_wait()之前,mutex將被重新加鎖,,以與進(jìn)入pthread_cond_wait()前的加鎖動作對應(yīng),。
2. int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond); 激發(fā)條件有兩種形式,pthread_cond_signal()激活一個等待該條件的線程,,存在多個等待線程時按入隊順序激活其中一個,;而pthread_cond_broadcast()則激活所有等待線程,。
這里需要說明的是pthread_cond_signal,只喚醒阻塞隊列上面的一個線程,,其他線程仍然阻塞在 條件鎖上面,,除非有其他線程繼續(xù)使用pthread_cond_signal繼續(xù)喚醒阻塞線程。 pthrad_cons_broadcast 喚醒阻塞隊列上面的所有線程,,但是只有一個線程可以競爭到 互斥鎖,, 其他線程此時不在阻塞在 條件鎖上面,而是阻塞在 互斥鎖上面 ,。直到得到互斥鎖的線程 unclock 掉互斥鎖,,這些線程在繼續(xù)競爭。
|
|