OLD | NEW |
| (Empty) |
1 /* step.c for step.exp */ | |
2 #include <ipc.h> | |
3 #include <pthread.h> | |
4 #include <st.h> | |
5 #include <signal.h> | |
6 #include <stdio.h> | |
7 | |
8 void alarm_handler (); | |
9 void alarm_handler1 (); | |
10 void alarm_handler2 (); | |
11 void thread1 (); | |
12 void thread2 (); | |
13 | |
14 #define TIME_LIMIT 30 | |
15 | |
16 | |
17 int count1 = 0; | |
18 int count2 = 0; | |
19 | |
20 pthread_t tid1, tid2; | |
21 pthread_attr_t attr1, attr2; | |
22 | |
23 pthread_mutex_t mut; | |
24 pthread_mutexattr_t mut_attr; | |
25 | |
26 pthread_condattr_t cv_attr_a, cv_attr_b; | |
27 pthread_cond_t cv_a, cv_b; | |
28 | |
29 struct cv_struct | |
30 { | |
31 char a; | |
32 char b; | |
33 } | |
34 test_struct; | |
35 | |
36 main () | |
37 { | |
38 /*init la struct */ | |
39 test_struct.a = 0; | |
40 test_struct.b = 1; | |
41 | |
42 /* create le mutex */ | |
43 if (pthread_mutexattr_create (&mut_attr) == -1) | |
44 { | |
45 perror ("mutexattr_create"); | |
46 exit (1); | |
47 } | |
48 | |
49 | |
50 if (pthread_mutex_init (&mut, mut_attr) == -1) | |
51 { | |
52 perror ("mutex_init"); | |
53 exit (1); | |
54 } | |
55 | |
56 /* create 2 cv */ | |
57 if (pthread_condattr_create (&cv_attr_a) == -1) | |
58 { | |
59 perror ("condattr_create(1)"); | |
60 exit (1); | |
61 } | |
62 | |
63 if (pthread_cond_init (&cv_a, cv_attr_a) == -1) | |
64 { | |
65 perror ("cond_init(1)"); | |
66 exit (1); | |
67 } | |
68 | |
69 if (pthread_condattr_create (&cv_attr_b) == -1) | |
70 { | |
71 perror ("condattr_create(2)"); | |
72 exit (1); | |
73 } | |
74 | |
75 if (pthread_cond_init (&cv_b, cv_attr_b) == -1) | |
76 { | |
77 perror ("cond_init(2)"); | |
78 exit (1); | |
79 } | |
80 | |
81 /* create 2 threads of execution */ | |
82 if (pthread_attr_create (&attr1) == -1) | |
83 { | |
84 perror ("attr_create(1)"); | |
85 exit (1); | |
86 } | |
87 | |
88 if (pthread_create (&tid1, attr1, thread1, &count1) == -1) | |
89 { | |
90 perror ("pthread_create(1)"); | |
91 exit (1); | |
92 } | |
93 | |
94 if (pthread_attr_create (&attr2) == -1) | |
95 { | |
96 perror ("attr_create(2)"); | |
97 exit (1); | |
98 } | |
99 | |
100 if (pthread_create (&tid2, attr2, thread2, &count2) == -1) | |
101 { | |
102 perror ("pthread_create(2)"); | |
103 exit (1); | |
104 } | |
105 | |
106 /* set alarm to print out data and exit */ | |
107 signal (SIGALRM, alarm_handler); | |
108 alarm (TIME_LIMIT); | |
109 | |
110 for (;;) | |
111 pause (); | |
112 } | |
113 | |
114 void | |
115 thread1 (count) | |
116 int *count; | |
117 { | |
118 tid_t tid; | |
119 | |
120 tid = getstid (); | |
121 printf ("Thread1 tid 0x%x (%d) \n", tid, tid); | |
122 printf ("Thread1 @tid=0x%x \n", &tid); | |
123 signal (SIGALRM, alarm_handler1); | |
124 | |
125 for (;;) | |
126 { | |
127 if (pthread_mutex_lock (&mut) == -1) | |
128 { | |
129 perror ("pthread_mutex_lock(1)"); | |
130 pthread_exit ((void *) 0); | |
131 } | |
132 | |
133 while (test_struct.a == 0) | |
134 { | |
135 if (pthread_cond_wait (&cv_a, &mut) == -1) | |
136 { | |
137 perror ("pthread_cond_wait(1)"); | |
138 pthread_exit ((void *) -1); | |
139 } | |
140 } | |
141 | |
142 (*count)++; | |
143 printf ("*******thread1 count %d\n", *count); | |
144 | |
145 test_struct.a = 0; | |
146 | |
147 test_struct.b = 1; | |
148 pthread_cond_signal (&cv_b); | |
149 | |
150 if (pthread_mutex_unlock (&mut) == -1) | |
151 { | |
152 perror ("pthread_mutex_unlock(1)"); | |
153 pthread_exit ((void *) -1); | |
154 } | |
155 } | |
156 } | |
157 | |
158 void | |
159 thread2 (count) | |
160 int *count; | |
161 { | |
162 tid_t tid; | |
163 | |
164 tid = getstid (); | |
165 printf ("Thread2 tid 0x%x (%d) \n", tid, tid); | |
166 printf ("Thread1 @tid=0x%x \n", &tid); | |
167 signal (SIGALRM, alarm_handler2); | |
168 | |
169 for (;;) | |
170 { | |
171 if (pthread_mutex_lock (&mut) == -1) | |
172 { | |
173 perror ("pthread_mutex_lock(2)"); | |
174 pthread_exit ((void *) 0); | |
175 } | |
176 | |
177 while (test_struct.b == 0) | |
178 { | |
179 if (pthread_cond_wait (&cv_b, &mut) == -1) | |
180 { | |
181 perror ("pthread_cond_wait(2)"); | |
182 pthread_exit ((void *) -1); | |
183 } | |
184 } | |
185 | |
186 (*count)++; | |
187 printf ("*******thread2 count %d\n", *count); | |
188 | |
189 test_struct.b = 0; | |
190 | |
191 test_struct.a = 1; | |
192 pthread_cond_signal (&cv_a); | |
193 | |
194 if (pthread_mutex_unlock (&mut) == -1) | |
195 { | |
196 perror ("pthread_mutex_unlock(2)"); | |
197 pthread_exit ((void *) -1); | |
198 } | |
199 } | |
200 } | |
201 | |
202 | |
203 void | |
204 alarm_handler () | |
205 { | |
206 printf ("\tcount1 (%d) \n\tcount2 (%d)\n", count1, count2); | |
207 exit (0); | |
208 } | |
209 | |
210 void | |
211 alarm_handler1 () | |
212 { | |
213 printf ("ALARM thread 1\n"); | |
214 } | |
215 | |
216 void | |
217 alarm_handler2 () | |
218 { | |
219 printf ("ALARM thread 2\n"); | |
220 pthread_exit ((void *) 0); | |
221 } | |
OLD | NEW |