Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / 5_взаимодействие и синхронизация процессов.doc
Скачиваний:
112
Добавлен:
20.06.2014
Размер:
1.47 Mб
Скачать

5.2.2.2. Объекты синхронизации, регламентированные posix

В стандарте POSIX 1003.4a (pthread) определены средства синхронизации потоков. Для обеспечения доступа к объектам синхронизации используется дескриптор, возвращаемый системой при создании этого объекта. С каждым объектом синхронизации связан дополнительный объект – набор атрибутов. Для потока такой объект содержит информацию о наследовании атрибутов, планировании, политике и приоритете планирования, размере стека и сторожевом размере стека[сторожевая резервная область стека, наличие которой помогает предотвратить или выявить переполнение стека].

Конкретная реализация стандарта pthread – DECthreads – исполнительная библиотека поддержки многопоточного выполнения дляOSF/1 от компанииDEC.

Потоки POSIX могут использовать дополнительную операцию pthread_join, которая блокирует вызывающий поток до тех пор, пока указанный поток не завершил работу. Предусмотрено два объекта синхронизации: мьютекс, условная переменная.

Мьютекс – двоичный семафор, обеспечивает взаимное исключение. Перед тем, как обратиться к ресурсу, защищенному мьютексом, поток блокирует его, а закончив работу – снимает блокировку. Если мьютекс уже заблокирован, поток либо ждет, либо продолжает некоторые другие действия, в зависимости от того, как была вызвана функция попытки блокирования.

Мьютекс создается вызовом pthread_mutex_init(), в котором можно задать атрибуты, включая следующие типы мьютекса:

1) быстрый (по умолчанию) ­ – блокируется потоком только один раз; если поток попытается заблокировать его еще раз без предварительного разблокирования, возникнет взаимоблокировка потока с самим собой: он будет заблокирован до тех пор, пока сам не разблокирует мьютекс, чего он сделать не сможет.

2) рекурсивный – может быть заблокирован потоком более одного раза. Полезен в тех случаях, когда требуется рекурсивный вызов своей же программы.

3) нерекурсивный – подобно быстрому мьютексу может быть заблокирован только один раз, после чего при попытке блокирования будет возвращаться ошибка. Если другой поток попытается разблокировать данный мьютекс, он тоже получит ошибку. Это средство для отладки программ, впоследствии рекурсивный мьютекс заменяется быстрым.

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

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

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