1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   | #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> static sem_t *s; int a, b, c; void getA() {   sleep(10);   a = 3;   printf("a: %d\r\n", a);   sem_post(s);   pthread_exit("Thread is done"); } void getB() {   sleep(5);   b = 10;   printf("b: %d\r\n", b);   sem_post(s);   pthread_exit("Thread is done"); } void getC() {   sem_wait(s);   sem_wait(s);   c = a+b;   printf("c: %d\r\n", c);   sleep(10);   pthread_exit("Thread is done"); } int main(int argc, char *argv[]) {   pthread_t tid1, tid2, tid3;   sem_unlink("s");   s = sem_open("s", O_CREAT, S_IRUSR | S_IWUSR, 0);   if(pthread_create(&tid1, NULL, (void*)getA, NULL)) {   }   if(pthread_create(&tid2, NULL, (void*)getB, NULL)) {   }   if(pthread_create(&tid3, NULL, (void*)getC, NULL)) {   }   pthread_join(tid3, NULL);   sem_close(s);   sem_unlink("s");   return 0; }
   |