【问题标题】:cancelling a thread inside a signal handler取消信号处理程序中的线程
【发布时间】:2012-07-20 07:02:08
【问题描述】:

我已经启动了一个计时器并将间隔设置为 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编译器

【问题讨论】:

    标签: c++ c linux multithreading signals


    【解决方案1】:

    据我所知,您几乎无法在信号处理程序中调用任何内容,因为您不知道代码处于什么状态。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您可以尝试使用标志:

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

        【讨论】:

          猜你喜欢
          • 2011-05-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 2015-09-16
          • 2012-01-24
          • 2011-11-18
          • 2014-08-29
          相关资源
          最近更新 更多