#include #include pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t c = PTHREAD_COND_INITIALIZER; volatile int p; int left[5], avail[5], wakes; void *tf(void *arg) { int i = (long)arg; pthread_mutex_lock(&m); while (left[i]) { while (!avail[i]) pthread_cond_wait(&c, &m), wakes++; left[i]--; avail[i]--; } pthread_mutex_unlock(&m); } int main() { pthread_t td[5]; int i, total; pthread_mutexattr_t ma; pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK); pthread_condattr_t ca; pthread_condattr_init(&ca); pthread_condattr_setpshared(&ca, PTHREAD_PROCESS_SHARED); //pthread_cond_init(&c, &ca); //pthread_mutex_init(&m, &ma); for (i=0; i<5; i++) left[i] = 100000; for (i=0; i<5; i++) pthread_create(td+i, 0, tf, (void*)(long)i); pthread_mutex_lock(&m); for (;;) { for (total=i=0; i<5; i++) total+=left[i]; if (!total) break; for (i=0; i<5; i++) avail[i]=1; pthread_cond_broadcast(&c); pthread_mutex_unlock(&m); pthread_mutex_lock(&m); } pthread_mutex_unlock(&m); for (i=0; i<5; i++) pthread_join(td[i], 0); printf("%d\n", wakes); }