пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Синхронизация потоков при помощи объектов ядра. Мьютексы. Пример

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

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

Для этого в ОС предусмотрен ряд механизмов. Их можно применить при синхронизации со следующими объектами ядра:

мьютексы,

семафоры,

события,

ожидаемые таймеры.

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

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

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

С помощью данной функции поток сообщает системе, что будет ожидать освобождения объекта hObject в течении dwMilliseconds миллисекунд. Функция возвращает следующие значения:

WAIT_OBJECT_0 – Объект перешел в свободное состояние

WAIT_TIMEOUT – Истекло время ожидания

WAIT_FAILED – Ошибка

Если dwTimeOut равно 0, то функция просто вернет состояние объекта. Если dwTimeOut равно значению INFINITE, то время ожидания равно бесконечности.

Аналогичная функция WaitForMultipleObjects ожидает освобождения всех или одного объекта из списка.

Мьютексы.
С помощью мьютексов можно синхронизировать выполнение потоков нескольких процессов, так как мьютексы являются объектами ядра.
Объекты ядра «мьютексы» гарантируют потокам взаимоисключающий доступ к единственному ресурсу.
Они содержат счетчик числа пользователей, счетчик рекурсии и переменную, в которой запоминается идентификатор потока. Мьютексы ведут себя точно так же, как и критические секции.
Идентификатор потока определяет, какой поток захватил мьютекс, а счетчик рекурсий — сколько раз. У мьютексов много применений, и это наиболее часто используемые объекты ядра. Как правило, с их помощью защищают блок памяти, к которому обращается множество потоков. Если бы потоки одновременно использовали какой-то блок памяти, данные в нем были бы повреждены. Мьютексы гарантируют, что любой поток получает монопольный доступ к блоку памяти, и тем самым обеспечивают целостность данных.
Для мьютексов определены следующие правила:
если его идентификатор потока равен 0 (у самого потока не может быть такой идентификатор), мьютекс не захвачен ни одним из потоков и находится в свободном состоянии;
если его идентификатор потока не равен 0, мьютекс захвачен одним из потоков и находится в занятом состоянии;
Для использования объекта-мьютекса один из процессов должен сначала создать его вызовом CreateMutex:

HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa, BOOL fInitialOwner, PCTSTR pszName);

Любой процесс может получить свой («процессо-зависимый») описатель существующего объекта «мьютекс», вызвав OpenMutex:

HANDLE OpenMutex( DWORD fdwAccess, BOOL bInheritHandle, PCTSTR pszName); 

Параметр fInitialOwner опрeделяет начальное состояние мьютекса.
Если в нем передается FALSE (что обычно и бывает), объект-мьютекс не принадлежит ни одному из потоков и поэтому находится в свободном состоянии. При этом его идентификатор потока и счетчик рекурсии равны 0.
Если же в нем передается TRUE, идентификатор потока, принадлежащий мьютексу, приравнивается идентификатору вызывающего потока, а счетчик рекурсии получает значение 1. Поскольку теперь идентификатор потока отличен от 0, мьютекс изначально находится в занятом состоянии.
Функции WaitForSingleObject и WaitForMultipleObjects ждут освобождения мьютекса после чего переводят его в занятое состояние.
Освободить мьютекс можно с помощью функции

  BOOL ReleaseMutex(HANDLE hMutex);

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

Пример «правильной» программы:

 HANDLE hMutex;

DWORD WINAPI StartThread1(CONST LPVOID lpParam)

 


26.12.2015; 23:13
хиты: 0
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь