Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Складові елементи та структури даних потоку у Windows



У об'єкті ядра "потік" є змінна — лічильник числа простоїв даного по струму При виклику CreateProcess або CreateThread він ініціалізувався значенням, рав ным 1, яке забороняє системі виділяти новому потоку процесорний час. Та кая схема дуже розумна: відразу після створення потік не готовий до виконання, йому потрібний час для ініціалізації.

Після гого як потік повністю ініціалізував, CreateProcess або CreateThread перевіряє, чи не переданий їй прапор CREATE_SUSPENDED, і, якщо так, повертає управ ление, залишивши потік в призупиненому стані В іншому випадку лічильник простоїв обнуляється, і потік включається в число планованих — якщо тільки він не чекає но когось події (наприклад, введення з клавіатури).

Створивши потік в призупиненому стані, Выможете настроїти деякі його властивості (наприклад, пріоритет, про який ми поговоримо пізніше). Закінчивши налаштування, Ви повинні дозволити виконання потоку. Для цього викличте ResumeThread і пері дайте описувач потоку, повернений функцією CreateThread (описувач можна узяти і із структури, на яку вказує параметр ppiProcInfo, що передається в CreateProcess).

DWORD ResumeThread(HANDLE hThread);

Якщо виклик ResumeThread пройшов успішно, вона повертає попереднє значення лічильника простоїв цього потоку; у іншому випадку — 0xFFFFFFFF.

Виконання окремого потоку можна призупиняти кілька разів. Якщо потік призупинений 3 рази, то і відновлений він має бути теж 3 рази — лише тоді система виділить йому процесорний час. Виконання потоку можна приос тановить не лише при його створенні з прапором CREATE_SUSPENDED, але і викликом SuspendThread.

DWORD RuspendThread(HANDLE hThread);

Будь-який потік може викликати цю функцію і призупинити виконання іншого потоку (звичайно, якщо його описувач відомий). Хоч про це ніде і не говориться (але я все одно скажу!), призупинити своє виконання потік здатний сам, а в зобновить себе без сторонньої допомоги — ні. Як і ResumeThread, функція Sus pendThread повертає попереднє значення лічильника простоїв цього потоку. Потік можна призупиняти не більше ніж MAXIMUM_SUSPEND_COUNT раз (у файлі WinNT.h це значення визначене як 127). Зверніть увагу, що Suspend Thread в режимі ядра працює асихронно, але в призначеному для користувача режимі не выпол няется, поки потокостается в призупиненому стані.

Створюючи реальне застосування, будьте обережні з викликами SuspendThread, оскільки не можна заздалегідь сказати, чим займатиметься його потік у момент призупинення. Наприклад, він намагається виділити пам'ять з купи і тому заблокував до неї дос тупий. Тоді іншим потокам, яким теж потрібна динамічна пам'ять, доведеться чекати його відновлення. SuspendThread безпечна тільки у тому випадку, коли Ви точно знаєте, що робить (чи може робити) потік, і передбачаєте усі заходи для исклю чения вірогідних проблем і взаємної блокіровки

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

  1. Як створюються потоки?
  2. Як завершити потік?
  3. Що таке потік?
  4. Для чого смороду використовуються?

Література

Електронний ресурс http://www.uinc.ru/articles/ 38/






Дата публикования: 2014-11-19; Прочитано: 402 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...