pthread_cond_wait 布满荆棘的人生 2023-08-17 17:37 40阅读 0赞 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中推荐使用这种模式。 转载于:https://www.cnblogs.com/xpylovely/p/11546540.html
还没有评论,来说两句吧...