Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Особливості програмного інтерфейсу потоків

Читайте также:
  1. I.3.Особливості політичного становища гетьманів у 1648-1667 роках.
  2. Банківські системи зарубіжних країн, особливості їх побудови та функціонування
  3. Біографічні особливості М. Драгоманова
  4. Біографічні особливості М. Костомарова
  5. БІОХІМІЧНІ ОСОБЛИВОСТІ "ПОТОЧНОГО" ВІДНОВЛЕННЯ
  6. БІОХІМІЧНІ ОСОБЛИВОСТІ МЕТОДИКИ ЗАНЯТЬ
  7. БІОХІМІЧНІ ОСОБЛИВОСТІ ПЕРЕБІГУ ВІДНОВНИХ
  8. Бюджет ЄС, його призначення і особливості. Організація бюджетного процесу. Бюджетна стратегія. Що необхідно вирішити Україні в цій царині для майбутнього вступу до ЄС?
  9. Види навчання. Особливості проблемного, розвивального, модульно-розвивального навчання.
  10. Види ораторського мистецтва. Особливості академічного красномовства

Програмний інтерфейс керування потоками у Windows ХР є частиною Win32 АРІ.
Такий інтерфейс ще називають інтерфейсом потоків Win32. Розглянемо особливості його використання.

Створення потоків у Win32 АРІ

У Win32 АРІ, як зазначалося раніше, для створення потоку призначена функція
CreateThread (), а для його завершення — EndThread ().

На практиці, однак, пару CreateThread( )/EndThread() є сенс використати лише
тоді, коли з коду, що виконує потік, не викликаються функції стандартної бібліотеки мови С (такі, як printf () або strcmp ()).

Річ у тому, що функції стандартної бібліотеки С у Win32 АРІ не пристосовані
до використання за умов багатопотоковості, і для того щоб підготувати потік до
роботи за таких умов, необхідно під час його створення і завершення виконувати
деякі додаткові дії. Ці дії враховані у спеціальних бібліотечних функціях роботи
з потоками, описаних у заголовному файлі process.h. Це функція _beginthreadex()
для створення потоку й _endthreadex() - для завершення потоку.

Розглянемо синтаксис функції _beginthreadex(). Відразу ж наголосимо, що той
самий набір параметрів (відмінний лише за типами) передають і у функцію
CreateThread (),

#include <process.h>

unsigned long _beginthreadex( void *security, unsigned stack_size.
unsigned WINAPI (*thread_fun)(void *).
void *argument, unsigned init_state, unsigned *tid ):

де: security - атрибути безпеки цього потоку (NULL — атрибути безпеки за замовчуванням);

stack_size — розмір стека для потоку (зазвичай 0, у цьому разі розмір буде таким самим, що й у потоку, який викликає _beginthreadex( ));

thread_fun - покажчик на функцію потоку;

argument — додаткові дані для передачі у функцію потоку;

іnit_state — початковий стан потоку під час створення (0 для потоку, що почне виконуватися негайно, CREATE_SUSPEND для припиненого);

tid — покажчик на змінну, в яку буде записано ідентифікатор потоку після виклику (0, якщо цей ідентифікатор не потрібний).

Функція _beginthreadex() повертає дескриптор створеного потоку, який потрібно перетворити в тип HANDLE:

HANDLE th - (HANDLE)_beginthreadex( ... );

Після отримання дескриптора, якщо він у цій функції більше не потрібний,
його закривають за допомогою CloseHandle() аналогічно до дескриптора процесу:

CloseHandle(th);

Розглянемо приклад задання функції потоку. Додаткові дані, які передаються
під час виклику _beginthreadex() за допомогою параметра argument, доступні в цій
функції через параметр типу void *

unsigned int WINAPI thread_fun (void *num) {

printf ("потік %d почав виконання\n”. (int)num);

// код функції потоку

printf ("потік %d завершив виконання\n*\ (int)num);

}

Ось приклад виклику _beginthreadex() з усіма параметрами:

unsigned tid:
int number = 0:

HANDLE th = (HANDLE) _beginthreadex (

NULL. 0. thread_fun. (void *)++number, 0, &tid);

Після створення потоку може виникнути потреба змінити його характеристики. Якщо це необхідно зробити у функції потоку, варто знати, як отримати доступ
до його дескриптора. Для цього використовують функцію GetCurrentThread ():

unsigned int WINAPI thread_fun (void *num) {

HANDLE curth = GetCurrentThread():

}

Завершення потоків у Win32 API

Функцію потоку можна завершити двома способами.

1. Виконати у ній звичайний оператор return (цей спосіб є найнадійнішим):

unsigned WINAPI thread_fun (void *num) {
return 0;

}

2. Викликати функцію _endthreadex() з параметром, що дорівнює коду повернення:

unsigned WINAPI thread_fun (void *num) {

_endthreadex(0);

}


Дата добавления: 2014-12-20; просмотров: 7 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2021 год. (0.039 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав