Операционные системы. Программирование в операционной среде Windows

27 В каждом потоке участок кода, работающий с разделяемым ресурсом, должен начинаться вызовом: VOID EnterCriticalSection(PCRITICAL_SECTION pes); a заканчиваться вызовом: VOID LeaveCriticalSection(PCRITICAL_SECTION pes); Функция EnterCriticalSection проверяет значения элементов структуры CRITICALSECTION. Если ресурс свободен, функция EnterCriticalSection записывает в соответствующий элемент структуры информацию о том, что вызывающий поток занимает ресурс, затем возвращает управление. Поток, получив доступ к ресурсу, продолжает свою работу. Если ресурс занят, то функция EnterCriticalSection переводит вызывающий поток в режим ожидания. Поток, находясь в режиме ожидания, не тратит процессорное время. Система запоминает, что поток хочет получить доступ к ресурсу. И как только поток, занимавший этот ресурс, освобождает ресурс, то система вновь начинает выделять ожидающему потоку процессорное время. При этом она передает ему ресурс, автоматически обновляя элементы структуры CRITICAL SECTION. Функция LeaveCriticalSection просматривает элементы структуры CRITICAL SECTION и уменьшает счетчик числа захватов ресурса вызывающим потоком на 1. Если значение счетчика больше О, то функция возвращает управление. Если значение счетчика достигло О и в системе есть потоки, ждущие данный ресурс, то функция настраивает значения элементов структуры так, что бы они сигнализировали о занятости ресурса, и отдает ресурс одному из ждущих потоков. Если же ресурс никому не нужен, то функция LeaveCriticalSection сбрасывает элементы структуры. Па каждый разделяемый ресурс следует использовать отдельную структуру CRITICAL SECTION. Например, если вы работаете с двумя массивами, то для участка кода обработки каждого из этих массивов лучше создать отдельную критическую секцию. Пе следует занимать критические секции надолго. Надолго занимая критическую секцию, приложение может блокировать другие потоки, что отрицательно скажется на его общей производительности. Если разделяемый ресурс используется, например, в диалоговых операциях, то время его использования может оказаться очень большим. Один из приемов быстрого освобождения ресурса - это сохранить его значение во временной переменной и освободить ресурс. 2.8. Лабораторная работа №2. Синхронизация потоков с помощью критических секций 1. Создать консольное приложение. 2. Создать поток. Функция потока должна выдавать сообщение о запуске потока.

RkJQdWJsaXNoZXIy MTY0OTYy