Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Функция pthread_join () может завершиться неудачно, если:
[EDEADLK] была обнаружена взаимоблокировка или значение параметра thread соответствует вызывающему потоку.
Функция pthread_join () не возвращает код ошибки [EINTR].
Примеры
Ниже приведен пример создания потока и его удаления.
typedef struct {
int *ar;
long n;
} subarray;
void *incer (void *arg) {
long i;
for (i = О; i < ((subarray *)arg) ->n; i++) ((subarray *) arg) ->ar[i]++;
}
int main (void) {
int ar[1000000];
pthread_t th1, th2;
subarray sbl, sb2;
sbl.ar = &ar[О];
sbl.n = 500000;
(void) pthread_create(&thl, NULL, incer, &sbl);
sb2.ar = &ar[500000];
sb2.n = 500000;
(void) pthread_create(&th2, NULL, incer, &sb2);
(void) pthread_join(thl, NULL);
(void) pthread_join(th2, NULL);
return 0;
}
Замечания по использованию
Отсутствуют.
Логическое обоснование
Функция pthread_join() представляет собой удобное и полезное средство для использования в многопоточных приложениях. Конечно, программист мог бы сымитировать эту функцию, если бы она не существовала, другими средствами, например, путем передачи функции start_routine () дополнительного состояния как части аргумента. Завершающийся поток в этом случае установил бы флаг, означающий завершение, и отправил бы условную переменную, которая является частью этого состояния, а присоединяющий поток ожидал бы получения этой условной переменной. Несмотря на то что такой метод позволил бы организовать ожидание наступления более сложных условий (например, завершения сразу нескольких потоков), ожидание завершения одного потока— весьма распространенная ситуация, и поэтому «заслуживает» отдельной функции. Кроме того, включение в библиотеку функции pthread_join () никоим образом не мешает программисту самому кодировать такие сложные ожидания. Таким образом, включение функции pthread_join () в этот том стандарта IEEE Std 1003.1-2001 считается весьма полезным.
Функция 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, .
Последовательность внесения изменений
Функция впервые реализована в выпуске Issue 5. Включена для согласования с расширение м POSIX Threads Extension.
Issue 6
Функция pthread_join () отмечена как часть опции Threads.
pthread_mutex_destroy, pthread_mutex_init
Имя
pthread_mutex_destroy, pthread_mutex_init — функции разруше н ия и инициализации мьютекса.
Синопсис
THR
#include
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 () используется для разрушения объекта мьютекса, адресуемого параметром mutex, в результате чего этот объект мьютекса становится неинициализированным. В конкретной реализации функция pthread_mutex_destroy () может устанавливать объект, адресуемый параметром mutex, равным недействительному значению. Разрушенный объект мьютекса можно снова инициализировать с помощью функции pthread_mutex_init(); результаты ссылки на этот объект после его разрушения не определены.
Нет никакой опасности в разрушении инициализированного объекта мьютекса, по которому не заблокирован в данный момент ни один поток. Попытка же разрушить заблокированный мьютекс может привести к неопределенно м у поведению.
Функция 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 ()), или указанный объект заблокирован;
Читать дальшеИнтервал:
Закладка: