#include #include pthread_cond_t cond; pthread_mutex_t mutex; #define NTHREAD 23 void * worker(void *arg) { int *i = arg; *i = 0; pthread_mutex_lock(&mutex); for (;;) { pthread_cond_wait(&cond, &mutex); (*i)++; } } int main(int argc, char *argv[]) { pthread_t t[NTHREAD]; int v[NTHREAD]; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); for (size_t i = 0; i < NTHREAD; i++) pthread_create(&t[i], NULL, worker, &v[i]); for (size_t i = 0;; i++) { pthread_cond_signal(&cond); if (i % 1000 == 0) { for (size_t k = 0; k < NTHREAD; k++) printf("%zu: %d\n", k, v[k]); } } for (size_t i = 0; i < NTHREAD; i++) { void *v; pthread_join(t[i], &v); } return 0; }