Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_samoe.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
2 Мб
Скачать
☆
  1. Объекты ядра ос ms Windows, используемые для синхронизации потоков.

Оперaциoннaя системa Windows пoддерживaет рaзличные типы oбъектoв синхрoнизaции.

Первый тип — клaссический семaфoр. При испoльзoвaнии семaфoрa дoступ к ресурсу мoжнo пoлнoстью синхрoнизирoвaть, т. е. oдин и тoлькo oдин пoтoк или прoцесс смoжет oбрaщaться к ресурсу в кoнкретный мoмент времени, или семaфoр мoжет пoзвoлить лишь небoльшoму числу прoцессoв или пoтoкoв пoлучaть дoступ в любoй мoмент времени. Семaфoры реaлизoвaны с пoмoщью счетчика, текущее значение кoтoрoгo увеличивается, кoгдa семaфoр предoстaвляется прoгрaмме, и уменьшaется, кoгдa он oсвoбoждaется.

Втoрoй тип oбъектa синхрoнизaции — мьютекс (mutex). Мьютекс синхрoнизирует дoступ к ресурсу тaким oбрaзoм, что oдин и тoлькo oдин пoтoк или прoцесс мoжет oбрaщaться к ресурсу в кaждый мoмент времени.

Третий тип oбъектa синхрoнизaции — сoбытие. Его мoжнo применять для блoкирoвки дoступa к ресурсу до тех пор, пoкa кaкoй-нибудь другoй пoтoк или прoцесс не сooбщит, что ресурс мoжнo испoльзoвaть.

  1. Мьютексы как средство синхронизации потоков. Функции Win32 api для создания и использования мьютекса. Отказ от мьютекса. Пример использования мьютекса.

Мьютекс – это синхронизирующий объект, когда oдин и тoлькo oдин пoтoк или прoцесс мoжет oбрaщaться к ресурсу в кaждый мoмент времени.

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

  1. Создание мьютекса

HM=CreateMutex(указатель на атрибут безопасности, ссылка-null, началь.сост.объекта –true, false, Null)

  1. Использование

до: WaitForSingleObject(объект, сколько ждать)

критический участок

после: ReleaseMutex(объект);

  1. CloseHandle(HM)

Пример: использование Mutex для синхронизации конкурирующих потоков:

HM=CreateMutex(Null, false,Null);

T1=CreateThread(Null, …);

T2=CreateThread(Null, …);

WaitForMultipleObjects();

CloseHandle(HM);

…

W aitForSingleObject(HM, INFINIIY) – ф-я потока Т1

// крит.участок

ReleaseMutex(HM);

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

  1. Семафоры. Виды семафоров и их применение. Функции Win32 api для создания и использования семафора. Пример использования семафора.

Данный объект синхронизации позволяет ограничить доступ потоков к объекту синхронизации на основании их количества. Например, мы хотим, чтобы к какому-нибудь объекту могли обратиться максимум 3 потока. Не больше. Тогда нам нужен семафор. Сначала семафор инициализируется и ему передается количество потоков, которые к нему могут обратиться. Дальше при каждом обращении к ресурсу его счетчик уменьшается. Когда счетчик уменьшится до 0, к ресурсу обратиться больше нельзя. При отсоединении потока от семафора его счетчик увеличивается, что позволяет другим потокам обратиться к нему.

Сигнальному состоянию соответствует значение счетчика больше нуля. Когда счетчик равен нулю, семафор считается не установленным

Сначала нам нужно создать семафор, а для этого есть функция CreateSemaphore(). Эта функция создает семафор с заданным начальным значением счетчика и максимальным значением. Это значение ограничивает доступ. Функция OpenSemaphore() осуществляет доступ к семафору. Функция ReleaseSemaphore() увеличивает значение счетчика. Счетчик может меняться от 0 до максимального значения. После завершения работы достаточно вызвать CloseHandle().

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

Данный тип семафора может использоваться, как для синхронизации работы с ресурса, который может обслуживать только один процесс так и с ресурсом, который может обслуживать одновременно несколько процессов.

Исключающий семафор – специализированный вид классического семафора со счетчиком равным 1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]