- •Билет № 3
- •Базовые конструкции структурного программирования
- •Процессы в Windows
- •Билет № 6
- •Объектно-ориентированное программирование
- •Простое наследование
- •Критические секции
- •Void InitializeCriticalSection(lpcritical_section lpCriticalSection); // вход в критическую секцию
- •Задача. Произвести инверсию (перестановка наоборот) массива
- •Билет № 9
- •События
- •Задача. Отсортировать массив методом выбора минимального элемента.
- •Билет № 12
- •Абстрактные классы
- •Void Print(void) /* аспект виртуальной функции*/
- •Void Print(void) /* аспект виртуальной функции*/
- •Исключения и их обработчики
- •Задача. Ввести с клавиатуры два вещественных числа и определить наибольшее из них.
- •Билет № 15
- •Назначение операционной системы
- •Резервирование, распределение и освобождение виртуальной памяти
- •Int *a; // указатель на массив целых чисел
- •Задача. Ввести целое число и определить, сколько в нем цифр.
События
Событием называется оповещение о некотором выполненном действии. В программировании события используются для оповещения одного потока о том, что другой поток выполнил некоторое действие. Сама же задача оповещения одного потока о некотором действии, которое совершил другой поток, называется задачей условной синхронизации или иногда задачей оповещения. В операционных системах 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;
}
Задача. Отсортировать массив методом выбора минимального элемента.
#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;
}
