1+ #include <stdio.h>
2+ #include <stdlib.h>
3+ #include <string.h>
4+ #include <unistd.h>
5+ #include <pthread.h>
6+
7+ pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER ;
8+ pthread_cond_t ready = PTHREAD_COND_INITIALIZER ;
9+
10+ int traveler_cond = 0 ;
11+
12+ void * traveler_arrive (void * name ){
13+ printf ("traveler %s need a taxi now\n" , (char * )name );
14+ pthread_mutex_lock (& lock );
15+ traveler_cond ++ ;
16+ pthread_cond_wait (& ready , & lock );
17+ pthread_mutex_unlock (& lock );
18+ printf ("traveler %s now got a taxi\n" , (char * )name );
19+ pthread_exit ((void * )0 );
20+ }
21+
22+ void * taxi_arrived (void * name ){
23+ printf ("taxi %s arrives\n" , (char * )name );
24+ while (1 ){
25+ pthread_mutex_lock (& lock );
26+ if (traveler_cond > 0 ){
27+ pthread_cond_signal (& ready );
28+ pthread_mutex_unlock (& lock );
29+ break ;
30+ }
31+ pthread_mutex_unlock (& lock );
32+ }
33+ pthread_exit ((void * )0 );
34+ }
35+
36+ int main (){
37+ pthread_t tids [3 ];
38+ int iRet = pthread_create (& tids [0 ], NULL , taxi_arrived , (void * )("Jack" ));
39+ if (iRet ){
40+ printf ("pthread_create error : iRet = %d\n" , iRet );
41+ return iRet ;
42+ }
43+ printf ("time passing by\n" );
44+ sleep (1 );
45+ iRet = pthread_create (& tids [1 ], NULL , traveler_arrive , (void * )("Susan" ));
46+ if (iRet ){
47+ printf ("pthread_create error : iRet = %d\n" , iRet );
48+ return iRet ;
49+ }
50+ printf ("time passing by\n" );
51+ sleep (1 );
52+ iRet = pthread_create (& tids [0 ], NULL , taxi_arrived , (void * )("Mike" ));
53+ if (iRet ){
54+ printf ("pthread_create error : iRet = %d\n" , iRet );
55+ return iRet ;
56+ }
57+ printf ("time passing by\n" );
58+ sleep (1 );
59+ void * retval ;
60+ for (int i = 0 ; i < 3 ; i ++ ){
61+ iRet = pthread_join (tids [i ], & retval );
62+ if (iRet ){
63+ printf ("pthread_join error : iRet = %d\n" , iRet );
64+ return iRet ;
65+ }
66+ printf ("retval = %ld\n" , (long )retval );
67+ }
68+ return 0 ;
69+ }
0 commit comments