while(1)
33 {
34 mm* p = NULL;
35 pthread_mutex_lock(&mutex);
36 while(head == NULL)
37 pthread_cond_wait(&cond, &mutex);
38 p = head->next;
39 printf("consumer %ld expense %d\n",pthread_self(), head->num);
40 free(head);
41 head = p;
42 pthread_mutex_unlock(&mutex);
43 }
這里調用pthread_cond_wait等待條件的發生時,mutex會被自動釋放。而且pthread_cond_wait中的兩個步驟必須是原子性的;
- 把調用線程放到條件等待隊列上
- 釋放mutex
調用這個函數進行等待條件的發生時,mutex會被自動釋放
signal到底是放在unlock之前還是之后??
void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }
如果把signal放在unlock之前,消費者線程會被喚醒,獲取mutex發現獲取不到,就又去sleep了。浪費了資源.但是在LinuxThreads或者NPTL里面,就不會有這個問題,因為在Linux 線程中,有兩個隊列,分別是cond_wait隊列和mutex_lock隊列, cond_signal只是讓線程從cond_wait隊列移到mutex_lock隊列,而不用返回到用戶空間,不會有性能的損耗。
所以在Linux中推薦使用這種模式。