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