blob: d71a6b2d79914c64d6c711a5004385b8bd58930e [file] [log] [blame]
/********************************************************
* An example source module to accompany...
*
* "Using POSIX Threads: Programming with Pthreads"
* by Brad nichols, Dick Buttlar, Jackie Farrell
* O'Reilly & Associates, Inc.
*
********************************************************
* specific.c
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define NUM_THREADS 3
pthread_key_t saved_time_key;
void free_time(void *arg )
{
struct timeval *timev=(struct timeval *)arg;
printf("free_time:\n");
free(timev);
}
void save_the_time(void)
{
struct timeval *timev;
timev = (struct timeval *)malloc(sizeof(struct timeval));
gettimeofday(timev, NULL);
printf("save_the_time: \t\t%ld %ld\n",timev->tv_sec, timev->tv_usec);
pthread_setspecific(saved_time_key, (void *)timev);
}
void what_time_did_i_save(void)
{
struct timeval *timev;
timev = pthread_getspecific(saved_time_key);
printf("what_time_did_i_save: \t%ld %ld\n",timev->tv_sec, timev->tv_usec);
}
void *thread_routine(void *arg)
{
int *my_id=(int *)arg;
printf("thread_routine %d\n", *my_id);
save_the_time();
what_time_did_i_save();
return(NULL);
}
extern int
main(void)
{
int i, *id_arg;
pthread_t threads[NUM_THREADS];
id_arg = (int *)malloc(NUM_THREADS*sizeof(int));
printf("main : initializing the key\n");
pthread_key_create(&saved_time_key, free_time);
printf("main : spawing the threads\n");
for (i = 0; i < NUM_THREADS; i++) {
id_arg[i] = i;
pthread_create(&(threads[i]),
NULL,
thread_routine,
(void *) &(id_arg[i]));
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
printf("main : thread %d has finished. \n", i);
}
printf("main : goodbye\n");
return 0;
}