Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Амир_СистПрог.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
90 Кб
Скачать
☆
  1. События

Событием называется оповещение о некотором выполненном действии. В программировании события используются для оповещения одного потока о том, что другой поток выполнил некоторое действие. Сама же задача опо­вещения одного потока о некотором действии, которое совершил другой поток, называется задачей условной синхронизации или иногда задачей опове­щения. В операционных системах Windows события описываются объектами ядра Events. При этом различают два типа событий:

  • события с ручным сбросом;

  • события с автоматическим сбросом.

Различие между этими типами событий заключается в том, что событие с ручным сбросом можно перевести в несигнальное состояние только по­средством вызова функции ResetEvent, а событие с автоматическим сбро­сом переходит в несигнальное состояние как при помощи функции ResetEvent, так и при помощи функции ожидания. При этом отметим, что если события с автоматическим сбросом ждут несколько потоков, используя функцию WaitForSingleObject, то из состояния ожидания освобождается только один из этих потоков.

Создаются события вызовом функции CreateEvent, которая имеет следую­щий прототип:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES IpSecurityAttributes, // атрибуты защиты

BOOL bManualReset, // тип события

BOOL blnitialState, // начальное состояние события

LPCTSTR lpName // имя события

) ;

Синхронизации потоков при помощи событий с автоматическим ! сбросом

#include <windows.h>

#include <iostream.h>

HANDLE hOutEvent, hAddEvent;

DWORD WINAPI thread (LPVOID)

{

for (int i = 0; i < 10; ++i) if (i == 4)

{

SetEvent(hOutEvent);

WaitForSingleObject(hAddEvent, INFINITE);

}

return 0;

}

int main()

{

HANDLE hThread;

DWORD IDThread;

// создаем события с автоматическим сбросом hOutEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hOutEvent == NULL) return GetLastError(); hAddEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hAddEvent == NULL) return GetLastError();

// создаем поток thread

hThread = CreateThread(NULL, 0, thread, NULL, 0, &IDThread); if (hThread == NULL) return GetLastError();

// ждем, пока поток thread выполнит половину работы WaitForSingleObject(hOutEvent, INFINITE);

// выводим значение переменной cout « "A half of the work is done." « endl; cout « "Press any key to continue." « endl; cin.get();

// разрешаем дальше работать потоку thread SetEvent (hAddEvent) ;

WaitForsingieObject(hThread, INFINITE);

CloseHandle(hThread);

CloseHandle(hOutEvent);

CloseHandle(hAddEvent);

cout « "The work is done." « endl;

return 0;

}

  1. Задача. Отсортировать массив методом выбора минимального элемента.

#include <iostream>

#include <stdio.h>

const int N = 10;

int main(int argc, char** argv) {

int i, j, nMin, A[N]={1,3,5,7,4,6,9,8,2}, c;

printf("\n unsorted array:\n");

for ( i = 0; i < N; i ++ )

printf("%d ", A[i]);

for ( i = 0; i < N-1; i ++ )

{

nMin = i;

for ( j = i+1; j < N; j ++ )

if ( A[j] < A[nMin] )

nMin = j;

if ( nMin != i )

{

c = A[i]; A[i] = A[nMin];

A[nMin] = c;

}

}

printf("\n sorted array:\n");

for ( i = 0; i < N; i ++ )

printf("%d ", A[i]);

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]