Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SIGEV_线程ID或SIGEV_信号在计时器过期时终止整个进程_C++_Multithreading_Timer_Signals - Fatal编程技术网

C++ SIGEV_线程ID或SIGEV_信号在计时器过期时终止整个进程

C++ SIGEV_线程ID或SIGEV_信号在计时器过期时终止整个进程,c++,multithreading,timer,signals,C++,Multithreading,Timer,Signals,我有一个处理多个线程的类应用程序。每个线程都链接到一个计时器。 另一个实体与此应用程序类的实例通信。每次通信成功时,链接到线程的每个计时器都会被销毁,并在其位置创建一个新的计时器 如果任何计时器过期,必须立即终止整个进程。即使是一毫秒也太多了 我在创建计时器时遇到的问题 void ApplicationThread::initializeTimer (long thId) { printf("my tid %d\n", thId); int r; stru

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

如果任何计时器过期,必须立即终止整个进程。即使是一毫秒也太多了

我在创建计时器时遇到的问题

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,0,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, 0, &ts, NULL) == -1) {
      perror("timer_settime");
      exit(1);
   }
}
参数thId是线程id。tidMap是包含“线程id”:“计时器id”对的映射

代码显然完全按照预期的方式工作,进程在一个计时器过期时立即停止,调用的方法是“signal_handler”,它只执行一个“exit()”

然而,在查看代码时,我的老板告诉我,SIGEV\u SIGNAL可能是分配给sev.SIGEV\u notify的错误值。他让我调查这件事,因为他认为SIGEV_信号只是向主线程发送回调,从而杀死它。然而,这意味着,在几微秒内,链接到主线程的其他线程仍然可以在最终消亡之前运行

因此,确保通知每个线程使用信号处理器方法的正确方法是设置sev.sigev\u notify=sigev\u thread\u ID

不幸的是,我在网上找到的文档对我来说太难理解了,我甚至不知道如何正确地测试它,所以我想知道你们是否有人有答案