#include #include void initFunc(void) { fprintf(stderr,"initFunc() in %d\n", (int)pthread_self()); /* ugly cast ! */ } void * task(void * data) { unsigned long i; fprintf(stderr,"begin task(%p) in %d\n", data,(int)pthread_self()); /* ugly cast ! */ for(i=0;i<50*1000*1000;i++) {} pthread_once((pthread_once_t *)data,initFunc); for(i=0;i<50*1000*1000;i++) {} fprintf(stderr,"end task(%p) in %d\n", data,(int)pthread_self()); /* ugly cast ! */ return((void *)0); } int main(void) { pthread_once_t ctrl1=PTHREAD_ONCE_INIT; pthread_once_t ctrl2=PTHREAD_ONCE_INIT; pthread_t th[6]; int i, j; for(i=0;i<6;i++) { if(pthread_create(&th[i],(pthread_attr_t *)0,task,i%2 ? &ctrl1 : &ctrl2)) { fprintf(stderr,"Pb pthread_create()\n"); return(1); } } for(j=0;j<6;j++) { void * result; if(pthread_join(th[j],&result)) { fprintf(stderr,"Pb pthread_join()\n"); return(1); } } return(0); }