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


Курс лекций:


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

Практикум:



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

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

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

            API WIN32 предоставляет программисту широкий набор средств для решения задачи синхронизации параллельных потоков. Основную роль в синхронизации потоков играет функция WaitForSingleObject:

            DWORD WaitForSingleObject(

    HANDLE  hObject,           // идентификатор ожидаемого объекта ядра

    DWORD  dwTimeout        // интервал ожидания в миллисекундах );

Эта функция ждет освобождения (перехода в состояние signaled) заданного в качестве первого параметра объекта ядра в течение интервала времени, определяемого вторым параметром. В случае, если указанный объект ядра в момент вызова функции WaitForSingleObject занят (находится в состоянии nonsignaled), вызвавший функцию поток переводится в состояние ожидания (блокируется) и ему не выделяется процессор до тех пор, пока либо ожидаемый объект перейдет в состояние signaled, либо закончится время ожидания. Для того, чтобы сделать интервал ожидания бесконечным, следует в качестве второго параметра функции указать значение INFINITE. В этом случае поток возобновится только тогда, когда освободится ожидаемый объект ядра.  Если во время ожидания соответствующий объект ядра был переведен в состояние signaled, функция возвращает значение WAIT_OBJECT_0, в противном случае – WAIT_TIMEOUT. В случае ошибки возвращаются значения WAIT_FAILEDили WAIT_ABANDONED (для объекта взаимоисключения mutex).

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