[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;
}