Параллельное и распределенное программирование на С++
Шрифт:
(void) pthread_join(thl, NULL);
(void) pthread_join(th2, NULL);
return 0;
}
Замечания по использованию
Отсутствуют.
Логическое обоснование
Функция pthread_join представляет собой удобное и полезное средство для использования в многопоточных приложениях. Конечно, программист мог бы сымитировать эту функцию, если бы она не существовала, другими средствами, например, путем передачи функции start_routine дополнительного состояния как части аргумента. Завершающийся поток в этом случае установил бы флаг, означающий завершение, и отправил бы условную переменную, которая является частью этого
Функция pthread_join обеспечивает простой механизм, позволяющий приложению ожидать завершения потока. После того как поток завершится, приложение может приступать к освобождению ресурсов, которые использовались этим потоком.
Например, после возвращения функции pthread_join может быть восстановлена любая область памяти, предоставленная приложением под стек.
Функции pthread_join или pthread_detach должны в конце концов быть вызваны для каждого потока, который создается с атрибутом detachstate, равным значению PTHREAD_CREATE_JOINABLE , чтобы м ожно было восстановить память, связанную с потоком.
Взаимодействие между функцией pthread_join и механизмом отмены потока хорошо определено по следующим причинам:
• функция pthread_join , как и все остальные не асинхронные функции безопасной отмены потоков, можно вызывать только при возможности отложенного типа отмены.
• отмена потока не может происходить в состоянии запрещения отмены.
Таким образом, имеет смысл рассматривать только стандартное состояние возможности отмены. Итак, вызов функции pthread_join либо отменяется, либо успешно завершается. Для приложения это различие очевидно, поскольку либо выполняется обработчик запроса на отмену, либо возвращается функция pthread_join . В этом случае условия «гонок» не возникают, поскольку функция pthread_join вызывается в состоянии отложенного запроса на отмену.
Будущие направления
Отсутствуют.
Смотри также
pthread_create, wait, том Base Definitions стандарта IEEE Std 1003.1-2001, <pthread.h>.
Последовательность внесения изменений
Функция впервые реализована в выпуске Issue 5. Включена для согласования с расширение м POSIX Threads Extension.
Issue 6
Функция pthread_join отмечена как часть опции Threads.
pthread_mutex_destroy, pthread_mutex_init
Имя
pthread_mutex_destroy, pthread_mutex_init — функции разруше н ия и инициализации мьютекса.
Синопсис
THR
#include <pthread.h>
int pthread_mutex_destroy (pthread_mutex_t *^utex);
int pthread_mutex_init (
pthread_mutex_t *restrict jnutex,
const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Описание
Функция pthread_mutex_destroy
Нет никакой опасности в разрушении инициализированного объекта мьютекса, по которому не заблокирован в данный момент ни один поток. Попытка же разрушить заблокированный мьютекс может привести к неопределенно м у поведению.
Функция pthread_mutex_init используется для инициализации м ьютекса, адресуе м ого пара м етро м mutex, объекто м атрибутов, адресуемым параметром attr. Если параметр attr содержит значение NULL, для инициализации применяются атрибуты мьютекса, действующие по умолчанию, т.е. результат в этом случае равносилен передаче адреса объекта, содержащего стандартные атрибуты мьютекса. После успешной инициализации мьютекс становится инициализированным и разблокированным.
Для осуществления синхронизации используется только сам объект, адресуемый параметром mutex. Результат ссылки на копии объекта mutex в обращениях к функциям pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock и pthread_mutex_destroy не определен.
Попытка инициализировать уже инициализированный объект мьютекса приведет к неопределенному поведению.
В случаях, когда атрибуты мьютекса, действующие по умолчанию, заранее определены, для инициализации мьютексов, которые создаются статически, можно использовать макрос PTHREAD_MUTEX_INITIALIZER. Резу л ьтат в этом с л учае эквивалентен динамической инициализации путем вызова функции pthread_mutex_init с параметром attr, равным значению NULL, но без выпо л нения проверки на наличие ошибок.
Возвращаемые значения
При успешном завершении функции pthread_mutex_destroy и pthread_ mutex_init возвращают нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Проверка на наличие ошибок с кодами [EBUSY] и [EINVAL] реализована так (если реализована вообще), как будто она выполняется в самом начале работы каждой функции, и код ошибки в случае ее обнаружения возвращается до модификации состояния мьютекса, заданного параметром mutex.
Ошибки
Функция pthread_mutex_destroy может завершиться неудачно, если:
[EBUSY] реализация обнаружила попытку разрушить объект, адресуе м ый параметром mutex, который относится к другому потоку (напри м ер, при использовании в функциях pthread_mutex_wait или pthread_mutex_timedwait ), или указанный объект заблокирован;
[EINVAL] значение, заданное пара м етро м mutex, недействительно.