Condition variables and mutex

. 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 }

 

Guess you like

Origin www.cnblogs.com/--lr/p/11247753.html