Читайте также:
|
|
Самый простой пример для рассмотрения — это использование тайм-аута с функцией pthreadjoin().
Применим макроопределение SIGEV_UNBLOCK_INIT() для инициализации структуры события, но можно было установить sigev_notify в SIGEV_UNBLOCK и «вручную». Можно было даже сделать еще более изящно, передав NULL вместо struct sigevent — функция TimerTimeout() понимает это как знак того, что нужно использовать SIGEV_UNBLOCK.
Если поток (заданный, в thread_id) остается работающим более 10 секунд, то системный вызов завершится по тайм-ауту — функция pthreadjoin () возвратится с ошибкой, установив errno в ETIMEDOUT.
Вы можете использовать и другую «стенографию», указав NULL в качестве значения тайм-аута (параметр ntime в декларации выше), что предпишет ядру не блокироваться в данном состоянии. Этот прием можно использовать для организации программного опроса. (Хоть программный опрос и считается дурным тоном, его можно весьма эффективно использовать в случае с pthreadjoin(), периодически проверяя, завершился ли нужный поток. Если нет, можно пока сделать что-нибудь другое.)
Ниже представлен пример программы, в которой демонстрируется неблокирующий вызов pthreadJoin():
int
pthread_join_nb (int tid, void **rval)
{
TimerTimeout (CLOCK_REALTIME, _NTO_TIMEOUT_JOIN, NULL, NULL, NULL);
return (pthread_join (tid, rval));)
Дата добавления: 2015-07-11; просмотров: 166 | Нарушение авторских прав