Электронный учебник:


Курс лекций:


Дополнительно:

Практикум:



Наши хостеры:

"Secret Net NT" версии 4.0 ном. серт. 342/8

--------------------------

чековая лента для терминалов

--------------------------

Синхронизация параллельных потоков

75

параметра идентификатор объекта ядра событие. Считается, что событие произошло, если объект ядра событие перешел в состояние signaled. Таким образом, поток, ожидающий событие (вызвавший функцию WaitForSingleObjectдля объекта ядра событие) будет блокирован системой до тех пор, пока не произойдет событие или не истечет заданный вторым параметром функции интервал ожидания. Для генерации события соответствующий поток должен воспользоваться функцией SetEvent, переводящей объект ядра событие в состояние signaled. Для сброса события используется функция ResetEvent, переводящая объект ядра событие в состояние nonsignaled. При создании события функцией CreateEvent можно задать режим автоматического сброса события. В этом случае функция ResetEvent не требуется, а объект ядра событие переводится в состояние nonsignaled функцией WaitForSingleObject по окончании ожидания события потоком. 

            Объект взаимоисключения (mutex) используется для организации взаимоисключения потоков при доступе к общему ресурсу. Этот объект ядра создается функцией CreateMutex, а для его открытия служит функция OpenMutex. Взаимоисключение потоков состоит в том, что  критический участок (некоторый участок кода, обычно осуществляющий доступ к общему ресурсу) одного потока не должен выполняться параллельно с критическими участками других потоков. Перед входом в критический участок поток должен вызывать функцию, называемую примитивом входа в критический участок. Назначение примитива входа состоит в блокировании вызвавшего его потока до тех пор, пока другие потоки не выйдут из своих критических участков. Перед выходом из критического участка поток должен вызвать функцию, называемую примитивом выхода из критического участка. Примитив выхода информирует систему о том, что текущий поток вышел из критического участка.  В качестве примитива входа в WIN32 используется функция WaitForSingleObject, которой в качестве параметра передается идентификатор объекта ядра mutex. Сразу после создания этот объект переводится в состояние signaled. Если функция WaitForSingleObject вызывается для объекта mutex, находящегося в состоянии signaled, то она просто возвращает управление, предварительно поменяв состояние объекта ядра на nonsignaled. Тем самым, первый вызвавший функцию WaitForSingleObjectпоток начинает выполнение своего критического участка, а остальные потоки, пытающиеся войти в свои критические участки, будут заблокированы. В качестве примитива выхода используется функция ReleaseMutex, переводящая объект ядра mutex в состояние signaled, и позволяющая, тем самым, другим потокам входить в их критические участки.

предыдущаяследующая