SIGEV_THREAD_ID或SIGEV_SIGNAL会在计时器到期时终止整个进程

问题描述

我有一个处理多个线程的Application类。每个线程都链接一个计时器。 另一个实体与此Application类的实例进行通信。每次通信成功时,链接到其线程的每个计时器都会被销毁,并在其位置创建一个新计时器。

如果任何计时器到期,则必须立即终止整个过程。哪怕只有一毫秒也是如此。

创建计时器时出现了我的问题

void  ApplicationThread::initializeTimer (long thId)
{
   printf("my tid %d\n",thId);
   int r;
   struct sigevent sev;
   timer_t *tid = new timer_t();

   signal(SIGKILL,signal_handler);

   sev.sigev_notify = SIGEV_SIGNAL;
   sev.sigev_notify_function = NULL;
   sev._sigev_un._tid = thId;
   sev.sigev_signo = SIGKILL;
   sev.sigev_notify_attributes = NULL;

   struct itimerspec ts;

   if (timer_create(CLOCK_REALTIME,&sev,tid) == -1) {
      perror("timer_create");
      exit(1);
   }

   tidMap[thId] = tid;

   memset(&ts,sizeof(ts));
   ts.it_value.tv_nsec = 0;
   ts.it_value.tv_sec = TIMER_SECOND;
   ts.it_interval.tv_nsec = 0;
   ts.it_interval.tv_sec = 0;

   if (timer_settime(*tid,&ts,NULL) == -1) {
      perror("timer_settime");
      exit(1);
   }
}

参数thId是线程ID。 tidMap是一个包含“ thread id”:“ timer id”对的地图。

代码显然完全按照预期的方式工作,一旦一个计时器到期,该进程就会终止,其中“ signal_handler”是仅执行“ exit()”的调用方法

但是,在查看代码时,我的老板告诉我 SIGEV_SIGNAL 可能是分配给 sev.sigev_notify 错误值。他要求我对此事进行调查,因为他认为SIGEV_SIGNAL仅向主线程发送了回调,因此将其杀死。但是,这意味着在几微秒内,链接到主线程的其他线程仍可以在最终死之前运行。

因此,确保每个单独的线程都被通知使用signal_handler方法的正确方法是设置 sev.sigev_notify = SIGEV_THREAD_ID

不幸的是,我在网上找到的文档太难理解了,我什至不知道如何正确地进行测试,所以我想知道你们中的任何人是否有答案

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)