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


Курс лекций:


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

Практикум:



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

закрытая школа

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

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

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

74

родительским процессом. Подобным же образом осуществляется и ожидание завершения  потока.

            CreateProcess (NULL, lpCommandLine, NULL, NULL, FALSE, dwCreationFlags,

                                     NULL, NULL, &StartupInfo, &ProcessInformation); 

            WaitForSingleObject (ProcessInformation.hProcess, INFINITE);

            CloseHandle(ProcessInformation.hProcess);

            CloseHandle(ProcessInformation.hThread);

            Более сложная синхронизация осуществляется при помощи синхронизирующих объектов ядра. Над любым синхронизирующим объектом определены следующие операции:

-          создание синхронизирующего объекта;

-          открытие синхронизирующего объекта;

-          изменение состояния (signaledили nonsignaled) синхронизирующего объекта;

-          закрытие синхронизирующего объекта.

Обычно синхронизирующий объект создается одним из потоков, участвующих в синхронизации, при помощи соответствующих функций API. При создании синхронизирующего объекта ему присваивается определенное программистом имя (некоторая текстовая строка). Поток, требующий синхронизации с другими потоками, должен сначала открыть синхронизирующий объект при помощи соответствующей функции API, возвращающей идентификатор объекта типа HANDLE. Для этого он должен знать имя, присвоенное синхронизирующему объекту при его создании. Заметим, что открывать и использовать синхронизирующий объект может любой поток в системе (разумеется, если он знает имя объекта), а не только поток того процесса, которым был создан объект. Другими словами, синхронизирующие объекты могут быть использованы как для синхронизации потоков одного процесса, так и потоков, принадлежащих разным процессам. Поток, создавший синхронизирующий объект , может не вызывать функцию открытия объекта, так как он уже имеет идентификатор объекта типа HANDLE, возвращаемый функцией создания объекта. Однако, вызов функции открытия объекта в этой ситуации не приведет к ошибке. По окончании работы с синхронизирующим объектом, он должен быть закрыт при помощи функции CloseHandle, причем каждому вызову функции создания либо открытия объекта должен соответствовать вызов функции CloseHandle.

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