Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_04.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
387.58 Кб
Скачать

Створення потоків

Створення потоку ініціюється Win32-функцією CreateThread, яка знаходиться в бібліотеці Kernel32.dll. При цьому створюється об’єкт ядра "потік", що зберігає статистичну інформацію про створюваний потік. У адресному просторі процесу виділяється пам’ять під стек потоку користувача. Потім ініціюється апаратний контекст потоку (нижче є опис відповідної структури CONTEXT).

Услід за цим створюється блок управління потоком разом із супутніми структурами, формується стек ядра потоку, і про створення потоку повідомляється підсистема Win32. Нарешті, потоку, який викликається, повертається описувач створюваного потоку і передається управління, а новому потокові може бути виділено процесорний час.

Функція CreateThread

Таким чином, якщо первинний потік процесу створюється при виклику функції CreateProcess, то для створення додаткових потоків потрібно викликати функцію CreateThread:

HANDLE CreateThread (

PSECURITY_ATTRIBUTES psa

DWORD cbStack

PTHREAD_START_ROUTINE pfnStartAddr

PVOID pvParam

DWORD fdwCreate

PDWORD pdwThreadID);

Дослідження прикладу програми створення потоку

Програма, текс якої наведений нижче, створює новий потік і передає йому параметр, числове значення якого цей потік виводить на екран (у консольному режимі).

Приклад 3.2

#include <iostream>

#include <windows.h>

using namespace std;

DWORD ThreadId;

DWORD ThreadParameter=10;

HANDLE hThread;

DWORD WINAPI MyThread(LPVOID lpParam)

{

TCHAR msgBuf[100]="Hello from thread!";

MessageBox(NULL, msgBuf, "mess..", MB_ICONINFORMATION);

return 0;

}

int main()

{

cout<<"Creating thread...\n";

hThread=CreateThread(

NULL, // атрибути безпеки за замовчуванням

0, // розмір стека за замовчуванням

(LPTHREAD_START_ROUTINE)MyThread , // вказівник на процедуру створюваного потоку

&ThreadParameter, // аргумент, що передається функції потоку

0, // прапорці створення за замовчуванням

&ThreadId); // отриманий ідентифікатор потоку

if (!hThread)

cout<<"CreateThread failed.";

WaitForSingleObject(hThread, 2000);

CloseHandle(hThread);

return 0;

}

Як самостійну вправу рекомендується написати програму, яка ілюструє простоту організації міжпотокового обміну в рамках одного процесу, наприклад, обмін через набір загальних глобальних даних.

Завершення потоку можна організувати різними способами, зокрема, за допомогою функцій ExitThread або TerminateThread. Рекомендований спосіб – повернення управління функцією потоку. Це єдиний спосіб, який гарантує коректне очищення всіх ресурсів, що належали потоку.

Подібно до процесів при завершенні потоку зіставлений із ним об’єкт ядра "потік" не звільняється доти, поки не будуть закриті всі зовнішні посилання на цей об’єкт.

Контекст потоку, перемикання контекстів

Особливу роль у структурах даних, що описують потоки, відіграє контекст потоку. Інформацію, що входить до складу контексту, необхідно періодично зберігати і відновлювати в разі виникнення різних подій, наприклад при перемиканні потоків. Зазвичай збереженню і подальшому відновленню підлягають:

- програмний лічильник, регістр стану і вміст решти регістрів процесора;

- покажчики на стек ядра і стек користувача;

- покажчики на адресний простір, в якому виконується потік (каталог таблиць сторінок процесу).

Ця інформація зберігається в поточному стекові ядра потоку. Контекст відображає стан регістрів процесора на момент останнього виконання потоку і зберігається в структурі CONTEXT, визначеній у заголовному файлі WinNT.h. Елементи цієї структури відповідають регістрам процесора, наприклад, для процесорів x86 до її складу входять Eax, Ebx, Ecx, Edx і т д.. Win32-функція GetThreadContext дозволяє отримати поточний стан контексту, а функція SetThreadContext – задати новий вміст контексту. Перед цією операцією потік рекомендується припинити.

Крім перерахованих, у системі є багато корисних функцій, що реалізовують API для управління потоками. Їх повний перелік міститься у відповідній літературі.

Практична частина

1. Складіть програми, наведені у прикладах 3.1, 3.2 теоретичної частини даної лабораторної роботи. Запустіть програми та переконайтеся, що вони працюють правильно (згідно з описом алгоритму їх роботи).

2. Оформіть звіт із виконаної лабораторної роботи, який повинен містити текст програм, та дайте відповіді на контрольні запитання.

Контрольні запитання та завдання

1. Що собою являють процеси та потоки?

2. Що собою являє блок управління процесом та що входить до його складу?

3. Що собою являє блок управління потоком та що входить до його складу?

4. Опишіть особливості реалізації процесів у операційній системі Windows.

5. Опишіть особливості реалізації потоків у операційній системі Windows.

6. Що собою являють волокна (легковагові потоки) і яке їх призначення?

7. Опишіть основні АРІ-функції керування процесами та потоками у Windows.

8. Опишіть стани потоків в ОС Windows.

9. Що відбувається під час переходу від виконання одного потоку до іншого?

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