我想要实现的是使用一个计时器,它在每一分钟完全同时启动新线程。 到目前为止,它完成了这项工作,但不幸的是,如果线程执行延迟了1分钟,那么就不会创建新线程 - 而是 - 计时器等待直到前一个线程完成然后执行新线程,这不是我的目标。 / p>
我怎样才能指示计时器每次都开始一个新的线程,而不是等到之前完成?
我用过的东西:
itimer.it_value.tv_nsec = 0;
itimer.it_interval.tv_sec = 60;
itimer.it_interval.tv_nsec = 0;
tt = time(NULL);
tt += 60; //next minute
tm_t = localtime(&tt);
tm_t->tm_sec = 0;
time_t vv = mktime(tm_t);
itimer.it_value.tv_sec = vv;
memset (&sigev, 0, sizeof (struct sigevent));
sigev.sigev_value.sival_int = 666;
sigev.sigev_notify = SIGEV_THREAD;
sigev.sigev_notify_attributes = NULL;
sigev.sigev_notify_function = threadFunction;
if (timer_create(CLOCK_REALTIME, &sigev, &timer) < 0){
exit (errno);
}
if (timer_settime(timer, TIMER_ABSTIME, &itimer, NULL) < 0){
exit (errno);
}
.....
答案 0 :(得分:1)
如果您阅读sigevent(7)
manual page,您会看到SIGEV_THREAD
函数被称为“好像”它是新线程的启动函数。系统可以启动新线程,或者系统可以使用单线程来处理所有计时器事件(符合您的描述),或者完全不同的东西。
如果要确保无条件地创建新线程,那么您应该创建一个创建线程的包装函数,并使sigev_notify_function
指向该包装函数。