2012-05-09 2 views
2

В настоящее время я использую pthreads, и у меня есть метод run() в одном из моих потоков. Метод run() проверяет первый элемент вектора на время начала и требует блокировки сна до тех пор, пока это не будет достигнуто, что позволит выполнять другие потоки. Проблема в том, что передний элемент вектора может обновляться, и мне нужно будет сбросить таймер в моем методе run(). Я не совсем уверен, как подойти к этой проблеме. Я не могу использовать сон, так как он будет ждать, пока время начала будет последней проверкой, которая, возможно, была обновлена ​​до более раннего времени.Pthread blocking/updatable timer

ответ

0

Независимо от того, что обновляет вектор, нужно будет так или иначе сигнализировать спящую нить. Существует дюжина способов сделать это, но два очевидных являются переменными состояния или просто используют select с трубой или аналогичным.

С переменными состояния вы можете использовать pthread_cond_timedwait с расчетным значением таймаута. Если это время, штраф. Если вы получите сигнал, вам нужно прочитать вектор, пересчитать таймаут и снова заблокировать.

Аналогично select() вы рассчитываете и используете значение таймаута из вектора и блока, ожидая тайм-аута или некоторого ввода на трубе. Независимо от того, что обновляет вектор, он также пишет что-то в трубу, и поток просыпается, пересчитывается и так далее ...

1

Вы можете использовать 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); 

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