#define _XOPEN_SOURCE 600 #include #include #include #include #include static pthread_mutex_t mutex; static pthread_cond_t cond; static unsigned int count = 0; void *thread1(void *dummy) { int ret; struct timespec req, res; req.tv_sec = 1; req.tv_nsec = 0; while(1) { putchar('0'); pthread_mutex_lock(&mutex); count++; pthread_mutex_unlock(&mutex); if (count == 8) pthread_cond_signal(&cond); do { ret = nanosleep(&req, &res); req.tv_sec = res.tv_sec; req.tv_nsec = res.tv_nsec; } while (ret != 0 && errno == EINTR); if (ret != 0) { perror("nanosleep()"); return (void *) NULL; } fflush(stdout); } return (void *) NULL; } void *thread2(void *dummy) { while (1) { putchar('1'); pthread_mutex_lock(&mutex); while (count != 8) { putchar('2'); pthread_cond_wait(&cond, &mutex); putchar('3'); } count = 0; pthread_mutex_unlock(&mutex); putchar('4'); } return (void *) NULL; } int main (void) { int i, rtn; pthread_t th1, th2; /* init mutex */ rtn = pthread_mutex_init(&mutex, NULL); if (rtn != 0) { fprintf(stderr, "pthread_mutex_init() failed for %d.\n", rtn); exit(EXIT_FAILURE); } /* init cond */ rtn = pthread_cond_init(&cond, NULL); if (rtn != 0) { fprintf(stderr, "pthread_cond_init() failed for %d.\n", rtn); exit(EXIT_FAILURE); } /* create threads */ rtn = pthread_create(&th1, NULL, thread1, (void *)NULL); if (rtn != 0) { fprintf(stderr, "pthread_create() - thread#1 failed for %d.\n", rtn); exit(EXIT_FAILURE); } /* create threads */ rtn = pthread_create(&th2, NULL, thread2, (void *)NULL); if (rtn != 0) { fprintf(stderr, "pthread_create() - thread#2 failed for %d.\n", rtn); exit(EXIT_FAILURE); } /* join */ pthread_join(th1, NULL); pthread_join(th2, NULL); pthread_cond_destroy(&cond); pthread_mutex_destroy(&mutex); exit(EXIT_SUCCESS); }