2012-07-20 7 views
2

타이머를 시작하고 간격을 5 초로 설정하고 신호 처리기를 등록했습니다. 시그널 핸들러 내에서 스레드를 종료하려고 시도하는 SIGALRM이 발생하면이를 수행 할 수 없습니다. 스레드가 종료되지 않고 대신 전체 프로세스가 종료됩니다.신호 처리기 내에서 스레드 취소 중

void signalHandler() 
{ 
     printf("Caught signal ...\n"); 
     printf("Now going to terminate thread..\n"); 
     pthread_kill(tid, SIGKILL); 
} 

void * thread_function() 
{ 
     int oldstate; 
     char result[256] = {0}; 
     time_t startTime = time(NULL); 
     time_t timerDuration = 5; 
     time_t endTime = startTime + timerDuration; 

     while(1) { 
       printf("Timer is runnuing as dameon..\n"); 
       if(!strcmp(result, "CONNECTED")) { 
         resp = 1; 
         pthread_exit(&resp); 
       } 
     } 
} 

int main() 
{ 
     int *ptr[2]; 

     signal(SIGALRM, signalHandler); 

     timer.it_interval.tv_usec = 0; 
     timer.it_interval. tv_usec = 0; 

     timer.it_value.tv_sec = INTERVAL; 
     timer.it_value.tv_usec = 0; 

     setitimer(ITIMER_REAL, &timer, 0); 
      pthread_create(&tid, NULL, thread_function, NULL); 
     pthread_join(tid, (void**)&(ptr[0])); 
     printf("test %d\n\n",*ptr[0]); 

     while(1) 
       printf("1"); 
} 

플랫폼 :
다음은 코드 리눅스, GCC 컴파일러

답변

2

지금까지 내가 당신이 모르는 당신이 꽤 많이 시그널 핸들러 내부에 아무것도 호출 할 수 없습니다 알고 있어요로 귀하의 코드가 어떤 상태에 있는지.

신호를 처리하기위한 스레드를 설정하는 것이 가장 좋습니다. 다른 모든 스레드는 pthread_setsigmask을 호출하고 모든 신호를 차단 한 다음 pthread_setsigmask을 호출하여 SIGALARM을 호출 한 다음 다른 스레드를 취소 할 수있는 sigwait을 호출하는 다른 스레드를 생성해야합니다.

0

당신은 플래그를 사용하여 시도 할 수 있습니다 : 단일 스레드 환경에 비해 처리 신호의

int go_on[number_of_threads] = { 1 }; 

void signalHandler() 
{ 
     printf("Caught signal ...\n"); 
     printf("Now going to terminate thread..\n"); 
     go_on[tid] = 0; 
} 

void * thread_function() 
{ /* */ 
    while(go_on[this_thread_id]) { 
       printf("Timer is runnuing as dameon..\n"); 
       if(!strcmp(result, "CONNECTED")) { 
         resp = 1; 
         pthread_exit(&resp); 
       } 
    } 
} 
1

방법은 멀티 스레드 환경에서 많은 차이가있다. 멀티 스레드 코드에서는 비즈니스 로직이있는 모든 스레드에 대한 모든 신호를 차단 한 다음 신호 처리를위한 별도의 스레드를 만들어야합니다. 이는 멀티 스레드 환경에서 신호가 전달 될 스레드를 확신 할 수 없기 때문입니다.

자세한 내용은이 링크를 참조하시기 바랍니다 :이 그렇다
http://devcry.heiho.net/2009/05/pthreads-and-unix-signals.html

을, 당신을 위해 잘 작동합니다 스레드를 사용 pthread_cancel을 죽일.