1 #include <stdio.h>
2 #include <pthread.h>
3 #include <stdio.h>
4 #include <errno.h>
5 #include <stdlib.h>
6 static pthread_rwlock_t rwlock;
7 #define WORK_SIZE 1024
8 char work_area[WORK_SIZE];
9 int time_to_exit=0;
10
11 void *thread_function_read_o(void *arg);
12 void *thread_function_read_t(void *arg);
13 void *thread_function_write_o(void *arg);
14 void *thread_function_write_t(void *arg);
15
16 int main(int argc, char *argv[])
17 {
18 int res;
19 pthread_t a_thread,b_thread,c_thread,d_thread;
20 void *thread_result;
21 res=pthread_rwlock_init(&rwlock,NULL);
22 if(res!=0)
23 exit(EXIT_FAILURE);
24 res=pthread_create(&a_thread,NULL,thread_function_read_o,NULL);
25 if(res!=0)
26 exit(EXIT_FAILURE);
27 res=pthread_create(&b_thread,NULL,thread_function_read_t,NULL);
28 if(res!=0)
29 exit(EXIT_FAILURE);
30 res=pthread_create(&c_thread,NULL,thread_function_write_o,NULL);
31 if(res!=0)
32 exit(EXIT_FAILURE);
33 res=pthread_create(&d_thread,NULL,thread_function_write_t,NULL);
34 if(res!=0)
35 exit(EXIT_FAILURE);
36 res=pthread_join(a_thread,&thread_result);
37 if(res!=0)
38 exit(EXIT_FAILURE);
39 res=pthread_join(b_thread,&thread_result);
40 if(res!=0)
41 exit(EXIT_FAILURE);
42 res=pthread_join(c_thread,&thread_result);
43 if(res!=0)
44 exit(EXIT_FAILURE);
45 res=pthread_join(d_thread,&thread_result);
46 pthread_rwlock_destroy(&rwlock);
47 return 0;
48 }
49 void *thread_function_read_o(void *arg)
50 {
51 printf("thread read one try to get lock\n");
52 pthread_rwlock_rdlock(&rwlock);
53 while(strncmp("end",work_area,3)!=0)
54 {
55 printf("this is thread read one.");
56 printf("the characters is %s\n",work_area);
57 pthread_rwlock_unlock(&rwlock);
58 sleep(2);
59 pthread_rwlock_rdlock(&rwlock);
60 while(work_area[0]=='\0')
61 {
62 pthread_rwlock_unlock(&rwlock);
63 sleep(2);
64 pthread_rwlock_rdlock(&rwlock);
65 }
66 }
67 pthread_rwlock_unlock(&rwlock);
68 time_to_exit=1;
69 pthread_exit(0);
70 }
71 void *thread_function_read_t(void *arg)
72 {
73 printf("thread read two try to get lock\n");
74 pthread_rwlock_rdlock(&rwlock);
75 while(strncmp("end",work_area,3)!=0)
76 {
77 printf("this is thread read two.");
78 printf("the characters is %s\n",work_area);
79 pthread_rwlock_unlock(&rwlock);
80 sleep(5);
81 pthread_rwlock_rdlock(&rwlock);
82 while(work_area[0]=='\0')
83 {
84 pthread_rwlock_unlock(&rwlock);
85 sleep(5);
86 pthread_rwlock_rdlock(&rwlock);
87 }
88
89 }
90 pthread_rwlock_unlock(&rwlock);
91 time_to_exit=1;
92 pthread_exit(0);
93 }
94
95 void *thread_function_write_o(void *arg)
96 {
97 printf("this is write thread one try to get lock\n");
98 while(!time_to_exit)
99 {
100 pthread_rwlock_wrlock(&rwlock);
101 printf("this is write thread one.\nInput some text. Enter 'end' to finish\n");
102 fgets(work_area,WORK_SIZE,stdin);
103 pthread_rwlock_unlock(&rwlock);
104 sleep(15);
105 }
106 pthread_rwlock_unlock(&rwlock);
107 pthread_exit(0);
108 }
109
110 void *thread_function_write_t(void *arg)
111 {
112 printf("this is write thread two try to get lock\n");
113 while(!time_to_exit)
114 {
115 pthread_rwlock_wrlock(&rwlock);
116 printf("this is write thread two.\nInput some text. Enter 'end' to finish\n");
117 fgets(work_area,WORK_SIZE,stdin);
118 pthread_rwlock_unlock(&rwlock);
119 sleep(20);
120 }
121 pthread_rwlock_unlock(&rwlock);
122 pthread_exit(0);
123 }