sem_t semAB, semMeC, semC, semD; sem_init(&semAB, 0, 1); sem_init(&semMeC, 0, 1); sem_init(&semC, 0, 0); sem_init(&semD, 0, 0); int nC=0; void A (void *arg) { sem_wait(&semAB); printf("A\n"); sem_post(&semC); } void B (void *arg) { sem_wait(&semAB); printf("B\n"); sem_post(&semC); } void C (void *arg) { sem_wait(&semMeC); nC++; if (nC==1) sem_wait(&semC); sem_post(&semMeC); printf("C\n"); sem_wait(&semMeC); nC--; if (nC==0) sem_post(&semD); sem_post(&semMeC); } void D (void *arg) { sem_wait(&semD); printf("D\n"); sem_post(&semAB); }