Page 122 - 4868
P. 122
Ошибка! Стиль не определен. 120
щоб планування потоку відбувалося глобально, а не локально, тобто щоб
потік конкурував за процесор зі всіма потоками, а не тільки із батьківським
потоком, що його створив. Виклик функції 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.
17.2. Керування потоками через семафори
Потоки взаємодіють між собою за допомогою змінних, що
оголошуються глобальними по відношенню до функцій, які виконуються
потоками. Потоки можуть бути синхронізовані за допомогою активного
очікування, блокувань, семафорів або умовних змінних.
Заголовочний файл semaphore.h включає в себе визначення і
прототипи операцій для семафорів. Дескриптори семафорів визначені як
глобальні по відношенню до потоків, які їх використовують, наприклад:
sem_t mutex;
Дескриптор пороку ініціюється викликом функції sem_init.
Наприклад, наступний виклик функції sem_init присвоює семафору mutex
значення 1:
sem_init(&mutex, SHARED, 1);
Якщо параметр SHARED не дорівнює нулю, то семафор може бути
розподілений між декількома процесами, інакше семафор може
використовувати тільки потоки одного процесу. Еквівалент операції P в
бібліотеці Pthreads педставлений функцією sem_wait, а операція V –
функцією sem_post. Отже, один із способів захисту критичної секції за