#include #include pthread_mutex_t mtx; pthread_cond_t cond; unsigned long x,y; void * task(void *data) { (void)data; pthread_mutex_lock(&mtx); while(x<=y) { fprintf(stderr,"until now %lu <= %lu\n",x,y); pthread_cond_wait(&cond,&mtx); } pthread_mutex_unlock(&mtx); fprintf(stderr,"and then %lu > %lu\n",x,y); return((void *)0); } int main(void) { pthread_t th; void * result; unsigned long t; x=0; y=10000000; pthread_mutex_init(&mtx,(pthread_mutexattr_t *)0); pthread_cond_init(&cond,(pthread_condattr_t *)0); if(pthread_create(&th,(pthread_attr_t *)0,task,(void *)0)) { fprintf(stderr,"Pb create\n"); return(1); } for(t=0;t<20000000;t++) { if(!(t%100000)) fputc('.',stderr); pthread_mutex_lock(&mtx); if((x=t)>y) pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mtx); } fputc('\n',stderr); if(pthread_join(th,&result)) { fprintf(stderr,"Pb join\n"); return(1); } if(pthread_cond_destroy(&cond)) { fprintf(stderr,"Pb condition destroy\n"); return(1); } if(pthread_mutex_destroy(&mtx)) { fprintf(stderr,"Pb mutex destroy\n"); return(1); } return(0); }