#include #include #include #include #include #include #define NTHREADS 10 pthread_cond_t c = PTHREAD_COND_INITIALIZER; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; size_t t = -1; void *thread(void *arg) { size_t i = (size_t)arg; struct timespec ts = { 1, 500000 * (i * 1) }; printf("%zu\n", i); nanosleep(&ts, NULL); pthread_mutex_lock(&m); t = i; pthread_cond_signal(&c); pthread_mutex_unlock(&m); } int main(void) { size_t i; int e; pthread_t tid[NTHREADS]; pthread_mutex_lock(&m); for(i = 0; i < NTHREADS; i++) { printf("Creating thread: %d\n", i); if ((e = pthread_create(&tid[i], NULL, thread, (void *)i)) != 0) errc(EXIT_FAILURE, e, "pthread_create() error"); } for (;;) { pthread_cond_wait(&c, &m); pthread_join(tid[t], NULL); if ((e = pthread_create(&tid[t], NULL, thread, (void *)t)) != 0) errc(EXIT_FAILURE, e, "pthread_create() error"); } return EXIT_SUCCESS; }