【问题标题】:pthread_join from a signal handler来自信号处理程序的 pthread_join
【发布时间】:2014-06-03 21:13:06
【问题描述】:

我有一个捕获程序,它除了捕获数据并将其写入文件还打印一些统计数据。打印统计数据的函数

static void* report(void)
{
         /*Print statistics*/
}

使用每秒到期的 ALARM 大约每秒调用一次。所以程序就像

void capture_program()
{
     pthread_t report_thread;

     while (!exit_now )
     {
         if (pthread_create(&report_thread,NULL,report,NULL)) {
             fprintf(stderr,"Error creating reporting thread! \n");
         }
         /*
           Capturing code
           --------------
           --------------
         */
         if(doreport)
             usleep(5);
     }
}  

void *report(void *param)
{
     while (true)
     {
         if (doreport)
         {
             doreport = 0
             //access some register from hardware
             usleep(5)
         }
     }
 }

计时器到期设置doreport 标志。如果设置了此标志,则调用report() 清除标志。我正在使用usleep 在程序中的两个线程之间交替。这似乎工作正常。 我还有一个信号处理程序来处理 SIGINT(即 CTRL+C)

static void
anysig(int sig)
{
    if (sig != SIGINT)
        dagutil_set_signal_handler(SIG_DFL);

    /* Tell the main loop to exit */
    exit_now = 1;
    return;
}

我的问题:

1) Is it safe to call pthread_join from inside the signal handler?
2) Should I use exit_now flag for the report thread as well?

【问题讨论】:

    标签: c multithreading pthreads posix


    【解决方案1】:

    真的,不要那样做。

    我找不到任何参考表明 pthread_join 是异步信号安全的(默认情况下你应该假设它们不是)。

    但即使是这样,你建议做的事情也非常丑陋。

    在您的信号处理程序中,只需在sig_atomic_t 变量中设置一个标志来表示信号已发生。然后比定期轮询,并在信号处理程序之外写入统计信息或加入线程。

    如果您不喜欢轮询,另一种巧妙的技术是“自写管道”。在信号处理程序写入写入端的位置设置一个管道(因为write 是异步安全的)并在您的主select() 循环或其他内容中读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2018-09-04
      • 2017-11-30
      • 2011-04-23
      相关资源
      最近更新 更多