7.2. Взаимные исключения: установка и снятие блокировки

7.2. Взаимные исключения: установка и снятие блокировки

Взаимное исключение (mutex) является простейшей формой синхронизации. Оно используется для защиты критической области (critical region), предотвращая одновременное выполнение участка кода несколькими потоками (если взаимное исключение используется потоками) или процессами (если взаимное исключение используется несколькими процессами). Выглядит это обычно следующим образом:

блокировать_mutex(…);

критическая область

разблокировать_mutex(…);

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

Взаимные исключения по стандарту Posix объявлены как переменные с типом pthread_mutex_t. Если переменная-исключение выделяется статически, ее можно инициализировать константой PTHREAD_MUTEX_INITIALIZER:

static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;

При динамическом выделении памяти под взаимное исключение (например, вызовом mallос) или при помещении его в разделяемую память мы должны инициализировать эту переменную во время выполнения, вызвав функцию pthread_ mutex_init, как показано в разделе 7.7.

ПРИМЕЧАНИЕ

Вам может попасться код, в котором взаимные исключения не инициализируются, поскольку в реализации инициализирующая константа имеет значение 0, а статические переменные автоматически инициализируются этим значением. Однако такой код некорректен.

Следующие три функции используются для установки и снятия блокировки взаимного исключения:

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mptr);

int pthread_mutex_trylock(pthread_mutex_t *mptr);

int pthread_mutex_unlock(pthread_mutex_t *mptr);

/* Все три возвращают 0 в случае успешного завершения, положительное значение Еххх – случае ошибки */

При попытке заблокировать взаимное исключение, которое уже заблокировано другим потоком, функция pthread_mutex_lock будет ожидать его разблокирования, a pthread_mutex_trylock (неблокируемая функция) вернет ошибку с кодом EBUSY.

ПРИМЕЧАНИЕ

Если несколько процессов ожидают освобождения взаимного исключения, какой из них начнет выполняться первым? Одна из возможностей, добавленных стандартом 1003.1b-1993, заключается в установке приоритета потоков. Мы не будем углубляться в эту область, отметим лишь, что разным потокам могут быть присвоены разные значения приоритета и функции синхронизации (работающие с взаимными исключениями, блокировками чтения-записи и семафорами) будут передавать управление заблокированному потоку с наивысшим значением приоритета. Раздел 5.5 книги [3] описывает возможности планирования выполнения в Posix.1 более подробно.

Хотя мы говорим о защите критической области кода программы, на самом деле речь идет о защите данных, с которыми работает эта часть кода. То есть взаимное исключение обычно используется для защиты совместно используемых несколькими потоками или процессами данных.

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

6.5.1 Блокировка области и снятие блокировки

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

6.5.1 Блокировка области и снятие блокировки Операции блокировки и снятия блокировки для области выполняются независимо от операций выделения и освобождения области, подобно тому, как операции блокирования-разблокирования индекса в файловой системе выполняются


Снятие фасок

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Снятие фасок Команда CHAMFER осуществляет снятие фасок на объектах. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify.Запросы команды CHAMFER: (TRIM mode) Current chamfer Dist1 = 0.0000, Dist2 = 0.0000 – режим с обрезкой, параметры фаски Select first line


Снятие фасок

Из книги AutoCAD 2009. Начали! автора Соколова Татьяна Юрьевна

Снятие фасок Команда CHAMFER осуществляет снятие фасок на объектах. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify.Запросы команды CHAMFER:(TRIM mode) Current chamfer Dist1 = 0.0000, Dist2 = 0.0000 – режим с обрезкой, параметры фаскиSelect first line or


Пример. Снятие фасок

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Пример. Снятие фасок Снять с детали фаски, нарисованные пунктирной линией (рис. 11.14).Запустите команду CHAMFER, вызвав ее из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify. Ответьте на запросы:_CHAMFER(TRIM mode) Current chamfer Dist1 = 0.0000, Dist2 = 0.0000Select first line or


Снятие фасок на гранях

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Снятие фасок на гранях Команда CHAMFER осуществляет снятие фасок (скашивание) на пересечениях смежных граней тел, как и в двумерном пространстве. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify. При использовании


ГЛАВА 7 Взаимные исключения и условные переменные

Из книги AutoCAD 2009. Учебный курс автора Соколова Татьяна Юрьевна

ГЛАВА 7 Взаимные исключения и условные переменные 7.1. Введение Эта глава начинается с обсуждения синхронизации — принципов синхронизации действий нескольких программных потоков или процессов. Обычно это требуется для предоставления нескольким потокам или процессам


Взаимные исключения Posix

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

Взаимные исключения Posix В листинге А.19 приведены глобальные переменные и функция main пpoгрaммы, измеряющей быстродействие взаимных исключений Posix.Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix//bench/incr_pxmutex1.с1  #include "unpipc.h"2  #define MAXNTHREADS 1003  int


Взаимные исключения Posix между процессами

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Взаимные исключения Posix между процессами Функция main первой программы использует взаимное исключение Posix для обеспечения синхронизации. Текст ее приведен в листинге А.32.Листинг А.32. Функция main для измерения быстродействия взаимных исключений между


7.19. Взаимные преобразования объектов Date, Time и DateTime

Из книги Linux программирование в примерах автора Роббинс Арнольд

7.19. Взаимные преобразования объектов Date, Time и DateTime В Ruby есть три основных класса для работы с датами и временем: Time, Date и DateTime. Опишем их особенности:• Класс Time преимущественно обертывает соответствующие функции из стандартной библиотеки языка С. Они, как правило,


Снятие фасок

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Снятие фасок Команда CHAMFER осуществляет снятие фасок на объектах. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify.Запросы команды


Снятие фасок на гранях

Из книги автора

Снятие фасок на гранях Команда CHAMFER осуществляет снятие фасок (скашивание) на пересечениях смежных граней тел, как и в двумерном пространстве. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify. При использовании


Снятие фасок

Из книги автора

Снятие фасок Команда CHAMFER осуществляет снятие фасок на объектах. Команда вызывается из падающего меню Modify ? Chamfer или щелчком на пиктограмме Chamfer на панели инструментов Modify.Запросы команды CHAMFER: (TRIM mode) Current chamfer Distl = 0.0000, Dist2 = 0.0000 – режим с обрезкой, параметры фаскиSelect first line or


Установка конфигурации блокировки

Из книги автора

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


14.2.2.2. Установка и снятие блокировок

Из книги автора

14.2.2.2. Установка и снятие блокировок После заполнения структуры struct flock следующим шагом является запрос блокировки. Этот шаг осуществляется с помощью соответствующего значения аргумента cmd функции fcntl():F_GETLK   Узнать, можно ли установить блокировку.F_SETLK   Установить или


26.7. Взаимные исключения

Из книги автора

26.7. Взаимные исключения Обратите внимание на то, что в листинге 26.8 при завершении выполнения очередного потока в главном цикле уменьшаются на единицу и nconn, и nlefttoread. Мы могли бы поместить оба эти оператора уменьшения в одну функцию do_get_read, что позволило бы каждому потоку