/* cc thisfile.c -lthread -lpthread */ #include #include #include #include #include #define NUM_THREADS 5 struct param_t { /* a sample parameter structure */ int id; char * name; int result; /* out parameter */ }; void *work(void *); /* thread routine */ int v = 0; /* global variable */ int main(int argc, char *argv[]) { int i; int len; pthread_t tid[NUM_THREADS]; /* array of thread IDs */ struct param_t param[NUM_THREADS]; /* array of parameters */ /* first build the parameters */ for (i = 0; i < NUM_THREADS; i ++) { param[i].id = i; param[i].name = (char*)malloc(32); /* 32 char name */ strcpy(param[i].name, "Thread name : "); len = strlen(param[i].name); param[i].name[len] = (char)(i + '0'); param[i].name[len+1] = 0; /* terminate the string */ } for ( i = 0; i < NUM_THREADS; i++) pthread_create(&tid[i], NULL, work, &(param[i])); for ( i = 0; i < NUM_THREADS; i++) pthread_join(tid[i], NULL); printf("main() reporting that all %d threads have terminated\n", i); printf("v should be %d, it is %d\n", NUM_THREADS, v); printf("output parameters in each thread\n"); for (i = 0; i < NUM_THREADS; i ++) { printf("thread %d output %d\n", param[i].id, param[i].result); } return (0); } /* main */ void * work(void *arg) { // int sleep_time = (int)arg; // printf("thread %ld sleeping %d seconds ...\n", pthread_self(), sleep_time); // sleep(sleep_time); // printf("\nthread %ld awakening\n", pthread_self()); v ++; ((struct param_t *)arg)->result = v; /* set the return param to be v */ return (NULL); }