. 1 #include <stdio.h> 2 #include <stdlib.h> . 3 #include < String .h> . 4 #include <unistd.h> . 5 #include <pthread.h> . 6 #include <errno.h> . 7 # the include <the iostream> . 8 the using namespace STD; . 9 10 / * prompt arrival of the taxi condition variables * / . 11 pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER; 12 is / * synchronization lock * / 13 is pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int travelerCount =0; 16 17 void *traveler_arrive(void* name) { 18 cout << "Travel:" << (char*)name << "need a taxi now!" << endl; 19 pthread_mutex_lock(&taxiMutex); 20 travelerCount++; 21 pthread_cond_wait(&taxiCond,&taxiMutex); 22 pthread_mutex_unlock(&taxiMutex); 23 cout << "Traveler:" << (char*)name << "now got a taxi!" << endl; 24 pthread_exit((void*)0); 25 } 26 void *taxi_arrive(void *name) { 27 cout << "Taxi:" << (char*)name << "arrives." << endl; 28 while (1) { 29 pthread_mutex_lock(&taxiMutex); 30 if (travelerCount > 0) { 31 pthread_cond_signal(&taxiCond); 32 pthread_mutex_unlock(&taxiMutex); 33 break; 34 } 35 pthread_mutex_unlock(&taxiMutex); 36 } 37 pthread_exit((void*)0); 38 } 39 40 int main() { 41 pthread_t tids[3]; 42 int iRet = pthread_create(&tids[0], NULL, taxi_arrive, (void*)(" Jack ")); 43 if (iRet) { 44 printf("pthread_creat error: iRet = %d\n", iRet); 45 return iRet; 46 } 47 printf("Time passing by\n"); 48 sleep(1); 49 iRet = pthread_create(&tids[1], NULL, traveler_arrive, (void*)(" Susan ")); 50 if (iRet) { 51 printf("pthread_creat error: iRet = %d\n", iRet); 52 return iRet; 53 } 54 printf("Time passing by\n"); 55 iRet = pthread_create(&tids[2], NULL, taxi_arrive, (void*)(" Mike ")); 56 if (iRet) { 57 printf("pthread_creat error: iRet = %d\n", iRet); 58 return iRet; 59 } 60 printf("Time passing by\n"); 61 sleep(1); 62 void *retval; 63 for (int i = 0; i < 3; i++) { 64 iRet = pthread_join(tids[i], &retval); 65 if (iRet) { 66 printf("Join error: iRet = %d\n", iRet); 67 return iRet; 68 } 69 printf("retval = %ld\n", (long)retval); 70 } 71 return 0; 72 }