2014-10-15 5 views
2

То, что я пытаюсь достичь, - использовать таймер, который запускает новый поток каждую минуту в одно и то же время. До сих пор это выполнялось, но, к сожалению, если выполнение потока задерживается более 1 минуты, то новый поток НЕ создается, а вместо этого - таймер ждет, пока предыдущий поток не закончится, а затем выполнит новый, что не является моей целью.C++ timer_create() не создает новый поток

Как я могу дать указание таймеру запускать новый поток каждый раз, не дожидаясь, пока он закончит?

Что я использовал:

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); 
} 

.....

ответ

1

Если вы читаете sigevent(7) manual page вы увидите, что для SIGEV_THREAD функция называется «как если бы» это было функция начало новый поток. Система может начать новую тему, или система может использовать одну нить для обработки всех событий таймера (что соответствует вашему описанию) или чего-то совершенно другого.

Если вы хотите, чтобы новый поток был создан безоговорочно, тогда вы должны создать функцию-обертку, которая создает поток, и сделать sigev_notify_function указателем на эту функцию-оболочку.

+0

Что вы подразумеваете под «функцией обертки»? –

+0

@IvailoTanusheff Функция, которую вы используете для 'sigev_notify_function', является простой функцией, которая создает поток, используя функцию * actual * thread (' threadFunction' в вашем случае). Это функция, которая «обертывает» вашу фактическую функцию. –

Смежные вопросы