问题描述
我有一个处理多个线程的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 (将#修改为@)