Операционные системы. Программирование в операционной среде Windows

37 Функция CreateEvent возвращает описатель ОЯ «событие». В параметре psa задается указатель на атрибуты защиты ОЯ. Если в параметре fManualReset задать TRUE, создается событие со сбросом вручную, если FALSE - с автосбросом. Параметр flnitialState определяет начальное состояние события: TRUE — свободное, FALSE - занятое. В параметре pszName можно передать адрес строки с именем ОЯ, а при передаче в нем значения NULL, создается безымянный ОЯ. Потоки из других процессов могут получить доступ к этому объекту несколькими способами: - вызовом функции CreateEvent с тем же значением параметра pszName; - наследованием описателя ОЯ; - дублированием описателя ОЯ вызовом функции DuplicateHandle; - вызовом функции OpenEvent с тем же значением параметра pszName, как и при создании ОЯ. Создав событие, можно управлять его состоянием. Вызов функции SetEvent переводит событие в свободное состояние, а вызов функции ResetEvent - в занятое состояние. По завершении работы с ОЯ «событие», его следует закрыть вызовом функции CloseHandle. BOOL SetEvent(HANDLE hEvent); BOOL ResetEvent(HANDLE hEvent); Рассмотрим пример использования ОЯ «событие» для синхронизации потоков при работе с общим блоком данных, считанных из файла (открытие файла и загрузку данных имитирует вызов функции OpenF ileAndReadContentsIntoMemory); // объявляем глобальный описатель события HANDLE g_hEvent; int main( int argc, char *argv[]) { // создаем объект событие со сбросом вручную, // в занятом состоянии g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // порождаем два потока HANDLE hThread[2]; DWORD dwTID; hThread[0] =_beginthreadex(NULL, 0, Funl, NULL, 0, &dwTID); hThread[l] =_beginthreadex(NULL, 0, Fun2, NULL, 0, &dwTID); //открываем файл и загружаем в память данные из файла OpenFileAndReadContentsIntoMemory(); // по завершении загрузки данных, разрешаем потокам обраш;аться // к памяти, т.е. устанавливаем событие в свободное состояние SetEvent(g_hEvent); } DWORD WINAPI Funl(PVOID pvParam) { // поток ждет освобождения события, // т.е. ждет когда в память будут загружены данные из файла

RkJQdWJsaXNoZXIy MTY0OTYy