|
|
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <thread.h> #define RANGE 10 /* ARGSUSED */ void *sometask(void *dummy) { thread_t thrID = thr_self(); unsigned seed = getpid() * time(NULL) * (thrID + 1); unsigned naptime= (unsigned)(1 + RANGE*((double)rand_r(&seed)/(double)RAND_MAX)); setbuf(stdout,NULL); (void)printf("thread %ld entering sometask\n", thrID); (void)printf("thread %ld naptime %d\n", thrID, naptime); (void)sleep(naptime); (void)printf("thread %ld leaving sometask\n", thrID); return NULL; }
sometask
The following examples on threads management will use (either explicitly or implicitly) the function sometask that appears in ``sometask''. This function will call sleep(S) to represent some arbitrary activity by the thread. Features to note in this example are:
#include <stdio.h> #include <stdlib.h> #include <thread.h> extern void *sometask(void *); main(int argc, char **argv) { int Nthreads, i; thread_t threadID; if(argc != 2){ (void)fprintf( stderr,"%s: usage: %s Nthreads\nwhere Nthreads > 0\n", argv[0], argv[0]); return 1; } if( (Nthreads = atoi(argv[1])) <= 0 ){ (void)fprintf( stderr,"%s: usage: %s Nthreads\nwhere Nthreads > 0\n", argv[0], argv[0]); return 1; } for(i = 0; i < Nthreads; i++) (void)thr_create(NULL, 0, sometask, NULL, 0, NULL); for(i = 0; i < Nthreads; i++){ (void)thr_join(0, &threadID, NULL); (void)printf("thread %ld is gone\n", threadID); } return 0; }
Multiple threads
The program in ``Multiple threads'' creates one or more threads as follows:
#include <stdio.h> #include <stdlib.h> #include <thread.h> #include <synch.h> extern void *sometask (void *); static void *repeatask(void *); static barrier_t common_wall; main(int argc, char **argv) { int Nthreads, i; if(argc != 2){ (void)fprintf( stderr,"%s: usage: %s Nthreads\nwhere Nthreads > 0\n", argv[0], argv[0]); return 1; } if((Nthreads = atoi(argv[1]))>0){ (void)barrier_init(&common_wall, Nthreads, USYNC_THREAD, NULL); } else { (void)fprintf( stderr,"%s: usage: %s Nthreads\nwhere Nthreads > 0\n", argv[0], argv[0]); return 1; } for(i = 0; i < Nthreads; i++) (void)thr_create(NULL, 0, repeatask, NULL, 0, NULL); thr_exit(NULL); /*NOTREACHED*/ } /* ARGSUSED */ static void *repeatask(void *dummy) { for(;;){ (void)printf("thread %ld at wall\n", thr_self()); (void)barrier_wait(&common_wall); (void)sometask(NULL); } }
barrier_wait
The example in ``barrier_wait'' is a variation of that in ``Multiple threads''. In this case: