LINUX.ORG.RU

Таймер в отдельном потоке.

 ,


0

1

Привет ЛОР, пытаюсь написать таймер:

        struct  itimerspec  ts;
        struct  sigevent    se;

        se.sigev_notify             = SIGEV_THREAD;
        se.sigev_value.sival_ptr    = (void*)(this);
        se.sigev_notify_function    = onTime;
        se.sigev_notify_attributes  = NULL;

        timer_create( CLOCK_REALTIME, &se, &timerId );

        ts.it_value.tv_sec = 0;
        ts.it_value.tv_nsec = interval*1000000;
        ts.it_interval.tv_sec = 0;
        ts.it_interval.tv_nsec = interval*1000000;

        started = timer_settime( timerId, 0, &ts, 0 );
Сейчас он для каждой итерации создает поток и затем его удаляет.
Как сделать, что бы обработчик таймера всегда крутился в одном, выделенном ему потоке?

★★★★★

se.sigev_notify = SIGEV_THREAD;

ЛОЛШТО? Это означает создание нити для каждого вызова обработчика сигнала.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

tailgunner

ЛОЛШТО? Это означает создание нити для каждого вызова обработчика сигнала.

CrossFire

Сейчас он для каждой итерации создает поток и затем его удаляет.

Точно, я и спрашиваю, как сделать по-другому.

CrossFire ★★★★★
() автор топика

SIGEV_SIGNAL и заблокируй в других тредах сигнал, который будешь посылать, очевидно же.

AptGet ★★★
()
Ответ на: комментарий от tailgunner

tailgunner

Я бы попробовал SIGEV_THREAD_ID

Спасибо, почитал про него, но там оговорка, что оно мол (Linux-specific), то есть, как я понимаю, скажем во фряхе/макоси работать не будет. Наверняка ведь есть какие-то общие подходы для всех unix-like.

CrossFire ★★★★★
() автор топика
Ответ на: комментарий от AptGet

AptGet

SIGEV_SIGNAL и заблокируй в других тредах сигнал, который будешь посылать, очевидно же.

Не очевидно, можно чуть подробнее?

CrossFire ★★★★★
() автор топика
Ответ на: комментарий от CrossFire
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <pthread.h>

static void* thread_func(void *p) {
    int sig;
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGUSR1);

    while(!sigwait(&sigset, &sig)) {
        printf("signal thread: tick\n");
    }
}

int main() {
    pthread_t thread;
    timer_t timer;
    sigset_t sigset;
    struct sigevent se = {0};
    struct itimerspec ts = {0};

    se.sigev_notify = SIGEV_SIGNAL;
    se.sigev_signo = SIGUSR1;

    ts.it_value.tv_sec = 1;
    ts.it_interval.tv_sec = 1;

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGUSR1);

    pthread_sigmask(SIG_BLOCK, &sigset, NULL);

    pthread_create(&thread, NULL, thread_func, NULL);

    timer_create(CLOCK_REALTIME, &se, &timer);

    timer_settime(timer, 0, &ts, NULL);

    printf("main thread: done\n");

    pthread_join(thread, NULL);

    exit(EXIT_SUCCESS);
}
AptGet ★★★
()
Ответ на: комментарий от CrossFire

как я понимаю, скажем во фряхе/макоси работать не будет.

ЕМНИП, в макоси (по крайней мере 10.5) таймеров (timer_create) вовсе не было :)

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.