ThreadJoin(), ThreadJoin_r()

Заблокировать до завершения потока

Прототип:

#include <sys/neutrino.h>
int ThreadJoin( int tid,
void **status );
int ThreadJoin_r( int tid,
void **status );

Аргументы:

tid
Идентификатор потока, который требуется присоединить, возвращаемый ThreadCreate().
status
Адрес указателя, куда функция может поместить статус завершения потока.

Библиотека:

libc

Описание:

Вызовы ядра ThreadJoin() и ThreadJoin_r() блокируют до тех пор, пока поток с таким tid завершается. Если status не равен NULL, функции сохраняют статус завершения потока по указанному в status адресу. Если поток tid уже завершился, функции немедленно возвращаются с успешным кодом и статусом, если последний был запрошен.

Функции идентичны во всём, кроме способа сообщения об ошибках.


Note: Вместо использования вызовов ядра напрямую, пользуйтесь pthread_join() или pthread_timedjoin().

Когда ThreadJoin() успешно завершается, целевой поток уже успешно уничтожен. До тех пор его tid не переиспользуется и немного ресурсов ядра (объект потока) сохраняется.

Нельзя присоединить поток, который был отвязан (см. ThreadCreate() и ThreadDetach()).

Целевой поток должен быть присоединяем. Несколько вызовов pthread_join(), pthread_timedjoin(), ThreadJoin() и ThreadJoin_r() для одного потока недопустимы.

Состояния блокировки:

STATE_JOIN
Вызывающий поток блокируется в ожидании заверешения указанного потока.

Возвращаемое значение:

ThreadJoin()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.
ThreadJoin_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

EBUSY
Поток уже был присоединён другим потоком.
EDEADLK
Попытка присоединить самого себя.
EFAULT
Ошибка при доступе ядра к status.
EINTR
Вызов был прерван сигналом.
EINVAL
Попытка присоединить отвязанный поток (см. ThreadDetach()).
ESRCH
Не существует потока с таким tid.
ETIMEDOUT
Таймаут в ядре разблокировал вызов. Подробнее - в TimerTimeout().

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

pthread_join(), pthread_timedjoin(), ThreadCreate(), ThreadDetach()




Предыдущий раздел: Описание API системной библиотеки