В настоящее время я использую pthreads, и у меня есть метод run() в одном из моих потоков. Метод run() проверяет первый элемент вектора на время начала и требует блокировки сна до тех пор, пока это не будет достигнуто, что позволит выполнять другие потоки. Проблема в том, что передний элемент вектора может обновляться, и мне нужно будет сбросить таймер в моем методе run(). Я не совсем уверен, как подойти к этой проблеме. Я не могу использовать сон, так как он будет ждать, пока время начала будет последней проверкой, которая, возможно, была обновлена до более раннего времени.Pthread blocking/updatable timer
ответ
Независимо от того, что обновляет вектор, нужно будет так или иначе сигнализировать спящую нить. Существует дюжина способов сделать это, но два очевидных являются переменными состояния или просто используют select с трубой или аналогичным.
С переменными состояния вы можете использовать pthread_cond_timedwait
с расчетным значением таймаута. Если это время, штраф. Если вы получите сигнал, вам нужно прочитать вектор, пересчитать таймаут и снова заблокировать.
Аналогично select()
вы рассчитываете и используете значение таймаута из вектора и блока, ожидая тайм-аута или некоторого ввода на трубе. Независимо от того, что обновляет вектор, он также пишет что-то в трубу, и поток просыпается, пересчитывается и так далее ...
Вы можете использовать pthread_kill(), чтобы разбудить конкретную нить, которая будет спать в sigtimedwait().
sigset_t _fSigMask; // global sigmask
Мы делаем это, прежде чем создавать темы. Темы наследуют свою сигнальную маску из потока, который их создает. Мы используем SIGUSR1 для сигнализации о наших потоках. Другие сигналы доступны.
sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);
Тогда спать нить:
int nSig;
struct timespec tmTimeout = { nSec, nNanoSec }; // from your vector of times
sigtimedwait(&fSigMask, &nSig, &tmTimeout);
Тогда, чтобы разбудить нить, PTHREAD, просто сигнализировать его:
pthread_kill(pThread, SIGUSR1);
Кстати, во время нашего тестирования, сна и бодрствования наши потоки таким образом были во много раз быстрее, чем использование переменных условий.