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 #include<iostream>
8 using namespace std;
9
10 /*提示出租车到达的条件变量*/
11 pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER;
12 /*同步锁*/
13 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 }