Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на гос экзамен 2 курс.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
99.15 Кб
Скачать

50. Синхронізація потоків.

Способы синхронизации потоков

Критический раздел — это блок кода, при выполнении которого поток не может быть прерван.

Механизм критических разделов основан на принципе взаимного исключения (mutual exclusion). Этот термин нам еще встретится при дальнейшем рассмотрении синхронизации потоков. Только один поток может быть владельцем критического раздела в каждый конкретный момент времени. Следовательно, один поток может войти в критический раздел, установить значения полей структуры и выйти из критического раздела. Другой поток, использующий эту структуру, также мог бы войти в критический раздел перед осуществлением доступа к полям структуры, а затем выйти из критического раздела.

Обратите внимание, что возможно определение нескольких объектов типа критический раздел, например, cs1 и cs2. Если в программе имеется четыре потока, и два первых из них разделяют некоторые данные, то они могут использовать первый объект критический раздел, а два других потока, также разделяющих другие данные, могут использовать второй объект критический раздел.

Имеется четыре функции для работы с критическими разделами

CRITICAL_SECTION cs ;

InitializeCriticalSection (&cs) ;

EnterCriticalSection (&cs) ;

LeaveCriticalSection (&cs) ;

DeleteCriticalSection (&cs) ;

Объект Mutex

Общая идея взаимоисключения похожа на критические секции. Только Mutex позволяет проводить синхронизацию не только между потоками(thread), но и процессами(process), то есть между приложениями.

Данный объект синхронизации регистрирует доступ к ресурсам и может находиться в двух состояниях:

  • установлен

  • сброшен

Mutex - установлен в тот момент когда ресурс свободен. Если к объекту есть доступ, то говорят, что сброшен. Для работы с Mutex есть ряд функций. Сначала объект нужно создать CreateMutex(), для доступа OpenMutex(), а для освобождения ресурса ReleaseMutex(). Для доступа к объекту Mutex используется ожидающая функция WaitForSingleObject(). Тонкость здесь следующая. Каждая программа создает объект Mutex по имени. То есть Mutex это именованный объект. А если такой объект синхронизации уже создала другая программа, то по вызову CreateMutex() мы получим указатель на объект, который уже создала первая программа. То есть у обоих программ будет один и тот же объект. Вот это и позволяет производить синхронизацию.

51 Общий план обработки исключений.

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

1

Возникло исключение; в данном случае это деление на ноль.

2

Управление передается обработчику исключений, в котором вычисляется выражение фильтра. Сначала вызывается функция GetExceptionCode, а затем ее возвращаемое значение используется в качестве аргумента функции Filter.

3

Функция фильтра выполняет действия, определяемые значением кода исключения.

4

В данном случае значением кода исключения является EXCEPTION_INT_DIVIDE_BY_ZERO.

5

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

6

Выполняется код обработчика исключений, связанного с оператором _except.

7

Управление передается за пределы блоков try и except.