ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
159
Запустите программу. Объясните наблюдаемые явления.
Лабораторная работа №2
Измените программу таким образом, чтобы она работала корректно.
Для этого воспользуйтесь
критическими секциями
.
Критическая секция – это участок кода, который может выполнять одновре-
менно только один поток.
Для создания критической секции необходимо задать переменную типа CRIT-
ICAL_SECTION (это такая структура), и проинициализировать ее при помощи
функции InitializeCriticalSection:
void InitializeCriticalSection (CRITICAL_SECTION* CritSect)
Точка входа в критическую секцию задается функцией EnterCriticalSection, а
выход – LeaveCriticalSection:
void EnterCriticalSection (CRITICAL_SECTION* CritSect)
void LeaveCriticalSection (CRITICAL_SECTION* CritSect)
Участок кода между двумя этими функциями сможет одновременно выпол-
нять лишь один поток.
После того, как критическая секция уже не нужна, ее следует удалить, освобо-
див системные ресурсы. Для этого служит функция
DeleteCriticalSection(&Sect1);
void DeleteCriticalSection (CRITICAL_SECTION* CritSect)
Запустите программу. В чем отличие от предыдущего случая?
Лабораторная работа №3
Перепишите программу с использованием мютексов.
Критическая секция является структурой, существующей в виртуальном мире
одной программы. Следовательно, она не может использоваться для синхронизации
потоков двух разных программ.
Для синхронизации потоков нескольких процессов следует использовать объ-
ект операционной системы –
мютекс
(
MUTually
EXclusive
– взаимно исключаю-
щий).
Мютекс может быть доступен всем программам через функции операционной
системы, однако владеть мютексом в один и тот же момент времени может только
один поток.
Доступ к мютексу осуществляется через дескриптор – переменную типа
HANDLE
.