Операционные системы. Программирование в операционной среде Windows
41 если поток захватывает один и тот же мьютекс несколько раз, пользуясь упомянутым исключением из общих правил. Когда ожидание ОЯ «мьютекс» успешно завершается, потоком получает монопольный доступ к заш,иш,енному ресурсу. Все остальные потоки, пытаюш,иеся обратиться к этому ресурсу, переходят в состояние ожидания. Когда поток, занимающий ресурс, заканчивает с ним работать, он должен освободить мьютекс вызовом функции ReleaseMutex. BOOL ReleaseMutex(HANDLE hMutex); Эта функция уменьшает счетчик рекурсии в объекте-мьютекс на единицу. Если данный объект передавался во владение потоку неоднократно, поток обязан вызвать ReleaseMutex столько раз, сколько необходимо для обнуления счетчика рекурсии. Как только счетчик станет равен нулю, переменная, хранящая идентификатор потока, тоже обнуляется, и объект- мьютекс освобождается. После этого система передаст объект-мьютекс одному из ждущих потоков. Мьютексы и критические секции одинаковы в том, что обеспечивают монопольный доступ к ресурсу. Достоинства ОЯ «мьютекс»: позволяют синхронизировать работу потоков разных процессов и позволяют определить время ожидания ресурса. Достоинства критических секций: высокое быстродействие. 3.6. Лабораторная работа №3. Синхронизация потоков с помощью объектов ядра 1. Создать родительский и дочерний процессы (см. порядок выполнения лабораторной работы №1). 2. В родительском процессе открыть файл. Передать из родительского в дочерний процесс дескриптор ОЯ «файл»: 2.1. Дескриптор файла объявить глобальной переменной HANDLE hFile; 2.2. В родительском процессе определить дескриптор запщты файла SECURITY_ATTRIBUTES saFile; saFile.nLength = sizeof (saFile); saFile.IpSecurityDescriptor = NULL, saFile.bInheritHandle = TRUE; И создать ОЯ «файл» HANDLE hFile= CreateFileA((LPCSTR)"c:\\work\\...\\myflie.txt", GENERIC_READIGENERIC_WRITE, 0,&saFile,CREATE_ALWAYS,0, NULL); 3. в дочернем процессе произвести чтение данных из открытого файла. 3.1. Указатель перенести на начало файла: SetFilePointer(hFile, О , NULL, FILE BEGIN);
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy