Page 153 - 6571
P. 153
pthread_t tid; /* дескриптор потоку */
По-третє, необхідно ініціалізувати атрибути, викликавши
функції:
pthread_attr_init(&tattr);
pthread_attr_setscope (&tattr, PTHREAD_SCOPE_SYSTEM);
І по-четверте потрібно створити самі потоки. Перед
створенням потоку визначаються його початкові атрибути, деякі
з яких пізніше можна змінити за допомогою функцій керування
потоками. Атрибути потоку включають розмір стека потоку, його
пріоритет і область планування (локальна або глобальна).
Зазвичай достатньо значень атрибутів, встановлених за
замовчуванням, за винятком області планування. Досить часто
необхідно, щоб планування потоку відбувалося глобально, а не
локально, тобто щоб потік конкурував за процесор зі всіма
потоками, а не тільки із батьківським потоком, що його створив.
Виклик функції pthread_attr_setscope враховує дану
необхідність. Новий потік створюється викликом функції
pthread_create:
pthread_create(&tid, &tattr, start_func, arg);
Перший аргумент – це адрес дескриптора потоку, що
заповнюється при його успішному створенні. Другий представляє
адрес дескриптора атрибутів потоку. Новий потік починає роботу
з виклику функції start_func з єдиним аргументом arg. Якщо
потік створений успішно, то функція pthread_create повертає
значення 0.
Для завершення роботи потоку необхідно викликати функцію:
pthread_exit(value);
Параметр value – це скалярне значення (або NULL).
Процедура exit викликається неявно, якщо потік повертає
керування з функції, виконання якої він почав.
Батьківський процес може очікувати завершення роботи до-
чірнього процесу, викликаючи функцію:
pthread_join(tid, value_ptr);
де tid – дескриптор дочірнього процесу, а параметр value_ptr
– адреса змінної в яку поміщаєть значення, що повертає потік під
час виклику функції exit.
152