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