Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / Презентация. Механизмы ядра. Часть 1.pptx
Скачиваний:
77
Добавлен:
20.09.2019
Размер:
6.57 Mб
Скачать

События, семафоры и мьютексы

Создание события

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h>

#define THREADCOUNT 20 /* Количество потоков */ HANDLE hEvent;

DWORD WINAPI SecondThread(PVOID pvParam) { int i; /* Ожидание */

if (WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_!0) { int * iParam = (int *) pvParam;

for (i = 0; i < 250; i++) { /* Вычисления */ *iParam += sin(i) * sin(i) + cos(i) * cos(i);

}

SetEvent(hEvent); /* В сигнальное состояние!*/

}

else { printf("Error...\n");

}

return 0;

}

! — должна быть

проверка

Создание события

 

 

SecurityAttr bInitialState

 

bManualReset

Name

 

int main() {

 

 

int i, x = 0;

 

 

HANDLE hThread[THREADCOUNT];

 

!

hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); /* Создание

события */

 

 

printf("[MAIN] X = %d\n", x); /* 0 */

!

for (i = 0; i < THREADCOUNT; i++) { /* Создаем потоки */

hThread[i] = CreateThread(NULL, 0, SecondThread, &x, 0,

 

NULL);

!

 

}

 

 

WaitForMultipleObjects(THREADCOUNT, hThread, TRUE, 5000);

 

!

 

 

printf("[MAIN] New X = %d (x)\n", x); /* 5000 */

 

for (i = 0; i < THREADCOUNT; i++) {

 

 

CloseHandle(hThread[i]);

 

 

!

 

 

}

! — должна быть

CloseHandle(hEvent);

 

проверка

 

Создание семафора

#include <stdio.h>

 

 

 

#include <stdlib.h>

 

 

 

#include <math.h>

 

 

 

#include <windows.h>

 

 

 

#define THREADCOUNT 20 /* Количество потоков */

 

HANDLE hSemaphore;

Handle

PrevCount

 

 

ReleaseCount

 

DWORD WINAPI SecondThread(PVOID pvParam) {

 

int i; /* Ожидание */

 

!

if (WaitForSingleObject(hSemaphore, INFINITE) ==

WAIT_OBJECT_0) { int * iParam = (int *) pvParam;

for (i = 0; i < 250; i++) { /* Вычисления */

*iParam += sin(i) * sin(i) + cos(i) * cos(i);

} ! ReleaseSemaphore(hSemaphore, 1, NULL); /* Увеличение на

1 */

}

else { printf("Error...\n");

}

return 0;

! — должна быть

проверка

}
WaitForMultipleObjects(THREADCOUNT, hThread, TRUE, 5000);! printf("[MAIN] New X = %d (x)\n", x);
for (i = 0; i < THREADCOUNT; i++) { CloseHandle(hThread[i]);!
}
CloseHandle(hSemaphore);!
Создание семафора
lMaxCount SecurityAttr Name
int main() { lInitialCount int i, x = 0;
HANDLE hThread[THREADCOUNT]; hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);! printf("[MAIN] X = %d\n", x);
for (i = 0; i < THREADCOUNT; i++) { /* Создаем потоки */ hThread[i] = CreateThread(NULL, 0, SecondThread, &x, 0, NULL);!

}

! — должна быть

проверка

Создание мьютекса

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h> #define THREADCOUNT 20 HANDLE hMutex;

DWORD WINAPI SecondThread(PVOID pvParam) {

 

int i; /* Ожидание */

!

if (WaitForSingleObject(hMutex, INFINITE) ==

WAIT_OBJECT_0) {

 

int * iParam = (int *) pvParam;

for (i = 0; i < 250; i++) { /* Вычисления */

*iParam += sin(i) * sin(i) + cos(i) * cos(i);

}

!

ReleaseMutex(hMutex); /* Освобождение мьютекса */

}

 

else {

 

printf("Error...\n");

 

}

! — должна быть

return 0;

}

проверка

Создание мьютекса

SecurityAttr

bInitialOwner

Name int main() {

int i, x = 0; HANDLE hThread[THREADCOUNT]; hMutex = CreateMutex(NULL, FALSE, NULL);! printf("[MAIN] X = %d\n", x);

for (i = 0; i < THREADCOUNT; i++) { /* Создаем потоки */ hThread[i] = CreateThread(NULL, 0, SecondThread, &x, 0, NULL);!

}

WaitForMultipleObjects(THREADCOUNT, hThread, TRUE, 5000);! printf("[MAIN] New X = %d (x)\n", x);

for (i = 0; i < THREADCOUNT; i++) { CloseHandle(hThread[i]);!

}

CloseHandle(hMutex);!

}

! — должна быть

проверка

Windows API подробнее

Windows API подробнее

DLL (англ. Dynamic Link Library) — это библиотека содержащая код и данные, которые могут использоваться более чем одной программой одновременно.

Win32 — 32-разрядный API для современных версий Windows. Базовые функции (например,

создание потока) реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll.

Базовые модули графического интерфейса

пользователя (например, MessageBox) — в user32.dll

Windows API подробнее

Решим три вопроса:

1.Что из себя представляет библиотека kernel32.dll?

2.Как можно отследить работу потоков?

3.Как узнать, какие библиотеки или API использует та или иная программа?