Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Управление счетчиком попыток



Если при выполнении функции EnterCriticalSection поток определяет, что КС уже занята, он обычно входит в ядро и блокируется до освобождения объекта CRITICAL_SECTION, что требует временных затрат. Но вы можете заставить поток сделать еще одну попытку перед блокировкой. Для управления счетчиком попыток существуют две функции: SetCriticalSectionSpinCount, которая позволяет динамически изменять счетчик, и InitializeCriticalSectionAndSpinCount, которая служит заменой функции InitializeCriticalSection.

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

Мьютексы

Объект мьютекс (от английского mutual exclusion — взаимное исключение) предос­тавляет более широкие возможности, чем критические секции кода. Мьютексу может быть присвоено имя и дескриптор, поэтому такие объекты могут быть использованы для межпроцессной синхронизации потоков в отдельных процессах. Например, два процесса, разделяющие память отображенного файла, могут использовать мьютексы для синхронизации доступа к разделенной памяти.

Мьютекс аналогичен объекту КС, но, в дополнение к возможности разделения процессами, мьютексы позволяют использовать тайм-аут и переходят в сигнальное состояние, когда процесс завершается и оставляет мьютекс. Поток вступает во владе­ние мьютексом (или "блокирует" мьютекс), выполняя ожидание для дескриптора мьютекса (функции WaitForSingleObject или WaitForMultipleObjects), и осво­бождает его функцией ReleaseMutex.

Поток может получать определенный мьютекс несколько раз; он не бу­дет блокировать мьютекс, если уже владеет им. В конечном счете поток должен столько же раз и освободить мьютекс.

Для работы с мьютексами используются функции Win32 CreateMutex, Release­Mutex и OpenMutex.

HANDLE CreateMutex (LPSECURITY_ATTRIBUTES lpsa,

BOOL fInitialOwner, LPCTSTR lpszMutexName)

Значение TRUE флага fInitialOwner позволяет вызывающему функцию потоку немедленно вступить во владение новым мьютексом. Эта элементарная операция за­щищает другие потоки от захвата владения мьютексом до того, как это сделает соз­дающий его поток. Как видно из имени, этот флаг игнорируется, если мьютекс уже существует.

Параметр lpszMutexName определяет имя мьютекса, которое, в отличие от имен файлов, чувствительно к регистру символов. Если это параметр имеет значение NULL, мьютекс будет безымянным. События, мьютексы, семафоры, объекты отображения файлов разделяют одно пространство имен. Поэтому все объекты синхронизации должны иметь разные имена. Имя ограничивается длиной в 260 символов.

Возвращенное значение NULL сообщает об ошибке.

Функция OpenMutex используется для открытия существующего именованного мьютекса. Она позволяет потокам разных процессов синхронизироваться так, как будто они принадлежат одному процессу. Создание мьютекса одним процессом должно предше­ствовать открытию его другим. Семафоры, события, отображения файлов также имеют функции создания и открытия. Всегда предполагается, что один про­цесс, например сервер, сначала выполняет функцию Create для создания именован­ного объекта, а другой процесс вызывает функцию Open, которая приводит к сбою, если данный именованный объект еще не создан. Если же порядок не имеет значе­ния, все процессы могут использовать вызов функции Create.

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

BOOL ReleaseMutex (HANDLE hMutex)





Дата публикования: 2015-11-01; Прочитано: 288 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...