logo search
ZH ос 20 вопр 36 стр

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

  1. Объекты синхронизации могут находится в двух состояниях.

  1. signaled – свободен

  2. non-signaled – занят

  1. Если состояние свободное, то работа потока разрешена, если в занятом, то запрещена. Для созда-ния объектов синхронизации используются функции типа

CreateMutex(…) (тот кто открывает, тот и закрывает, нет счётчика),

CreateSemaphore(…) (есть счётчик),

CreateEvent(…).

Они возвращают дескриптор (указатель) на созданный объект.

  1. Для перехода объектов синхронизации в свободное состояние используются функции типа

ReleaseMutex(…),

ReleaseSemaphore(…),

ReleaseEvent(…).

  1. Для ожидания освобождения события используются функции

WaitForSingleObject(…) – ожидает освобождение какого-либо одного объекта. В качестве пара-метров передаётся дескриптор объекта, время ожидания.

WaitForMultipleObject(…) – ожидает освобождения нескольких объектов. В качестве параметров выступают указатель на массив дескрипторов, количество ожидаемых объектов, время ожидания и тип ожидания (все объекты или хотя бы один объект).

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

CreateMutex(…); WaitForSingleObject(…);

ОС анализирует, в каком состоянии находится объект синхронизации. Если объект синхронизации находится в состоянии non-signaled, то ОС прекращает выполнение этого потока.

Если объект занят, то обработка не будет происходить. ReleaseMutex(…)

Если объект находится в свободном состоянии, то функция WaitForSingleObject(…) переводит его в занятое состояние, то есть никакой другой поток не может получить доступ к данным.