Иллюстрированный самоучитель по Visual Studio .NET

Механизмы синхронизации

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

DWORD WaitForSingleObject (HANDLE hObject, DWORD dwTimeOut);
DWORD WaitForMultipleObjects(DWORD nCount,
CONST HANDLE* lpHandles, BOOL bWaitAll,
DWORD dwTimeOut);

Первая функция приостанавливает поток до тех пор, пока или заданный параметром hObject синхронизирующий объект не освободится, или пока не истечет интервал времени, задаваемый параметром dwTimeOut. Если указанный объект в течение заданного интервала не перейдет в свободное состояние, то система вновь активизирует поток и он продолжит свое выполнение. В качестве параметра dwTimeOut могут выступать два особых значения:

Таблица 12.3. Значения, выступающие в качестве параметра dwTimeOut.

dwTime Out Описание
0 Функция только проверяет состояние объекта (занят или свободен) и сразу же возвращается
INFINITE Время ожидания бесконечно. Если объект так и не освободится, поток останется в неактивном состоянии и никогда не получит процессорного времени

В соответствии с причинами, по которым поток продолжает выполнение, функция WaitForSingleObject может возвращать одно из следующих значений:

Таблица 12.4. Возвращение значений функцией WaitForSingleObject.

Возвращаемое значение Описание
WAITJ1MEOUT Объект не перешел в свободное состояние, но интервал времени истек
WAIT_ABANDONED Ожидаемый объект является мьютексом, который не был освобожден владеющим им потоком перед окончанием этого потока. Объект мьютекс автоматически переводится системой в состояние свободен. Такая ситуация называется "отказ от мьютекса"
WAIT_OBJECT_0 Объект перешел в свободное состояние
WAIT_FAILED Произошла ошибка, причину которой можно узнать, вызвав GetLastError

Функция WaitForMultipleObjects задерживает поток и в зависимости от значения флага bWaitAll ждет одного из следующих событий:

  • освобождение хотя бы одного синхронизирующего объекта из заданного списка;
  • освобождение всех указанных объектов;
  • истечение заданного интервала времени.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.