Как следует из названия, я ищу лучший способ реализовать несколько таймеров на С++ (а не на С++ 11). Моя идея состоит в том, чтобы иметь один pthread (posix) для обработки таймеров. Мне нужно как минимум 4 таймера, 3 периодических и 1 одиночный выстрел. Минимальное разрешение должно быть 1 секунда (для самого короткого таймера) и 15 часов для самого длинного. Все таймеры должны работать одновременно.
Это разные реализации, которые приходят мне на ум (я не знаю, являются ли они самыми безопасными в среде потоков или самыми простыми):
1) Используя структуру itimerspec, sigaction и sigevent следующим образом:
static int Tcreate( char *name, timer_t *timerID, int expireMS, int intervalMS )
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = app;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
{
perror("sigaction");
}
/* Set and enable alarm */
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = timerID;
timer_create(CLOCK_REALTIME, &te, timerID);
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = intervalMS * 1000000;
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = expireMS * 1000000;
timer_settime(*timerID, 0, &its, NULL);
return 1;
}
2) Использование clock() и проверка разницы во времени, например:
std::clock_t start;
double duration;
start = std::clock();
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
3) Используя хроно, как это:
auto diff = tp - chrono::system_clock::time_point();
cout << "diff:" << chrono::duration_cast<chrono::minutes>(diff).count()
<< " minute(s)" << endl;
Days days = chrono::duration_cast<Days>(diff);
cout << "diff:" << days.count() << " day(s)" << endl;
Пожалуйста, рассматривайте это как идеи, а не реальный рабочий код.
Каково ваше мнение об этом?