多线程编程:深度理解 条件变量的激发与等待
条件变量的激发与等待

pthread_cond_signal激活一个等待该条件的线程,taxi_001到了站台一看没人(没有等待该条件的线程),触发的条件变量被直接复位,于是taxi_001排在等待队列里面。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <errno.h> #include <iostream> #include <pthread.h> using namespace std; /*提示出租车到达的条件变量*/ pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER; /*同步锁*/ pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER; int travelerCound=0; void * traveler_arrive(void * name){ cout<<"Traveler: "<<(char *)name<<" needs a taxi now!"<<endl; pthread_mutex_lock(&taxiMutex); travelerCound++; pthread_cond_wait(&taxiCond,&taxiMutex); pthread_mutex_unlock(&taxiMutex); cout<<"Traveler: "<<(char *)name<<" now got a taxi!"<<endl; travelerCound--; pthread_exit((void*)0); } void * taxi_arrive(void * name){ cout<<"Taxi: "<<(char *)name<<" arrives."<<endl; while(1){ pthread_mutex_lock(&taxiMutex); if(travelerCound>0){ pthread_cond_signal(&taxiCond); pthread_mutex_unlock(&taxiMutex); break; } pthread_mutex_unlock(&taxiMutex); } pthread_exit((void*)0); } int main(){ pthread_t tids[6]; int iRet = pthread_create(&tids[0],NULL,taxi_arrive,(void*)(" taxi_001 ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("Time passing by.\n"); sleep(2); iRet = pthread_create(&tids[1],NULL,traveler_arrive,(void*)(" Susan ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("2 seconds have passed.\n"); sleep(3); iRet = pthread_create(&tids[2],NULL,taxi_arrive,(void*)(" taxi_002 ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("3 seconds have passed.\n"); sleep(6); iRet = pthread_create(&tids[3],NULL,traveler_arrive,(void*)(" Cong ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("6 seconds have passed..\n"); sleep(5); iRet = pthread_create(&tids[4],NULL,traveler_arrive,(void*)(" Ting ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("5 seconds have passed.\n"); sleep(10); iRet = pthread_create(&tids[5],NULL,taxi_arrive,(void*)(" taxi_003 ")); if(iRet){ printf("pthread_create error: iRet=%d\n",iRet); return iRet; } printf("6 seconds have passed..\n"); void *retval; for(int i=0;i<6;i++){ iRet=pthread_join(tids[i],&retval); if (iRet){ printf("pthread_join error: iRet=%d\n",iRet); return iRet; } printf("retval=%ld\n",(long)retval); } return 0; }
浙公网安备 33010602011771号