pthread_cond_wait
 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中推荐使用这种模式。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号