Skip to content

Commit 5710c55

Browse files
authored
Add files via upload
1 parent 1de0a79 commit 5710c55

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

code/pthread_mutex_cond.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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

Comments
 (0)