[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nptl] Re: nptl
Hi,
Seb thank you for your such a nice and supportive explanation.
See, what actually I am doing is I am creating three threads and setting
timer for each thread after the expiration of timer SIGALRM is called
which in turn called signal() where a signal handler function is called
by each thread.In that signal handler function I am printing the
execution time of each thread.But the timing for each thread is not
right.I am here attaching the program and I think problem is that
signals are delivering randomly to a process.
Please throw some light on it.
#include<pthread.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/time.h>
#include<time.h>
#include<semaphore.h>
#include<signal.h>
#define CNTR 3
int which=ITIMER_REAL,sigint;
time_t timeval;
struct itimerval value;
struct timespec ts;
struct timeval tz;
volatile sig_atomic_t flag[CNTR]={0},k=0;
static pthread_key_t key;
pthread_mutex_t mylock;
sigset_t mask;
sem_t mysem;
void myflag(int sig) /* signal handler function */
{
int ret,s=0,mysig;
(void)time(&timeval);
int k =(int)pthread_getspecific(key);
printf("In signal K:%d and thread id is:%lu time taken:->%s\n",k,pthread_self(),ctime(&timeval));
return;
}
void *mytimer(void *argv) /* Thread function */
{
int interval,ret,mysig,sigint;
pthread_mutex_lock(&mylock);
interval = *(int *)argv;
free(argv);
switch(interval)
{
case 1:
value.it_interval.tv_sec = 1; /* Setting the timer for each thread */
value.it_interval.tv_usec = 0;
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
setitimer(which,&value,NULL);
printf("%d",interval);
ret=pthread_setspecific(key,(void *)1);
if(ret!=0) {printf("Value cann't set\n"); exit(0); }
break;
case 2:
value.it_interval.tv_sec = 2;
value.it_interval.tv_usec =0;
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
setitimer(which,&value,NULL);
printf("%d",interval);
ret=pthread_setspecific(key,(void *)2);
if(ret!=0) {printf("Value cann't set\n"); exit(0); }
break;
case 3:
value.it_interval.tv_sec = 3;
value.it_interval.tv_usec = 0;
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
setitimer(which,&value,NULL);
printf("%d",interval);
ret=pthread_setspecific(key,(void *)3);
if(ret!=0) { printf("Value cann't set\n"); exit(0); }
break;
}
pthread_mutex_unlock(&mylock);
while(1);
}
int main()
{
int ret,*q,status,i=0;
static pthread_key_t key;
pthread_t tid[CNTR];
pthread_attr_t attr;
long int in;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
memset(&mask,0,sizeof(mask));
sigemptyset(&mask);
sigaddset(&mask,SIGALRM);
signal(SIGALRM,&myflag);
ret = sem_init(&mysem,0,1);
if(ret!=0){ printf("Semaph. cann't Initialize"); exit(0); }
ret=pthread_key_create(&key,NULL); if(ret!=0) { printf("Cann't create the key"); exit(0); }
else printf("Key is created\n");
//======================================THREAD CREATION=========================================================
for(i=0;i<CNTR;i++)
{
q=(int *)malloc(sizeof(int));
*q=i+1;
ret=pthread_create(&tid[i],&attr,&mytimer,(void *)q);
if(ret!=0) { printf("Error in thr creation %d",ret); exit(0); }
}
while(1);
return;
}