2

我已经启动了一个计时器并将间隔设置为 5 秒并为其注册了一个信号处理程序。当遇到 SIGALRM 时,我试图终止信号处理程序内的线程,但 bt 无法做到这一点。线程没有被终止,而不是整个进程被杀死。
以下是代码:

 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");
}

平台:Linux,gcc编译器

4

3 回答 3

2

据我所知,你几乎不能在信号处理程序中调用任何东西,因为你不知道你的代码处于什么状态。

您最好的选择是设置一个线程来处理您的信号。所有其他线程都应该调用pthread_setsigmask并阻止所有信号,然后创建另一个线程,该线程调用pthread_setsigmaskcatch SIGALARM,然后调用sigwait,此时它可以取消另一个线程。

于 2012-07-20T07:19:44.827 回答
1

与单线程环境相比,多线程环境中处理信号的方式大不相同。在多线程代码中,您应该为具有您的业务逻辑的所有线程屏蔽所有信号,然后创建一个单独的线程来处理信号。这是因为,在多线程环境中,您无法确定信号将传递到哪个线程。

请参阅此链接了解更多详情:
http ://devcry.heiho.net/2009/05/pthreads-and-unix-signals.html

除此之外,要杀死一个线程,请使用pthread_cancel,这对您来说应该可以正常工作。

于 2012-07-20T08:58:07.697 回答
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);
                }
   }
}
于 2012-07-20T07:24:57.287 回答