Бібліотека Pthread

Бібліотека Pthread являє собою Арі інтерфейс для створення і керування потоками в додатках. Бібліотека Pthread базується на стандартизованому інтер­фейсі програмування, який був визначений комітетом по випуску стандартів ІЕЕЕ в стандарті POSIX 1003.1.с. Сторонні фірми-виробники притримуються стандарту POSIX в реалізаціях, які називаються бібліотеками потоків Pthread або POSIX.

Бібліотека Pthread містить більше 60 функцій, які можемо поділити на наступні категорії.

1. Функції керування потоками.

1.1. Конфігурування потоків.

1.2. Відміна потоків.

1.3. Стратегія планування потоків.

1.4. Доступ доданих потоків.

1.5. Обробка сигналів.

1.6. Функції доступу до атрибутів потоку.

1.6.1. Конфігурування атрибутів потоку.

1.6.2. Конфігурування атрибутів, стеків потоків.

1.6.3. Конфігурування атрибутів, стратегій планування потоків.

2. Функції управління мю тексами.

2.1. Конфігурування мю тексів.

2.2. Управління пріоритетами.

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

2.3.1. Конфігурування атрибутів мютексів.

2.3.2. Конфігурування атрибутів протоколів мютексів.

2.3.3. Конфігурування атрибутів управління пріоритетами мютексів.

3. Функції управління умовними змінними.

3.1. Конфігурування умовних змінних.

3.2. Функції доступу до атрибутів умовних змінних.

3.2.1. Конфігурування атрибутів умовних змінних.

3.2.2. Функції спільного використання умовних змінних.

4.1. Анатомія простої багатопоточної програми

Довільна проста багатопоточна програма повинна складатися з основного потоку та функцій, які будуть виконувати інші потоки. Вибрана для реалізації модель створення та функціонування потоків визначає, яким чином в програмі будуть створюватися потоки і як буде відбуватися керування ними. Потоки створюються за принципом ²все і відразу² або при певних умовах. Приклад простої багатопоточної програми, в якій реалізована модель делегування, подано в лістінгу 1.

// Лістінг 1. Використання моделі делегування в простій багато поточній // програмі

# include <iostream>

# include <pthread.h>

void *task1 (void *X) // Визначаємо задачу для виконання потоком ThreadA

{ // . . .

cout << “Потік А завершено” << endl; }

void *task2 (void *X) // Визначаємо задачу для виконання потоком ThreadB

{ // . . .

cout << “Потік B завершено” << endl; }

int main (int argc, char *argv []) {

pthread_t ThreadA, ThreadB; // Оголошуємо потоки

pthread_create (&ThreadA, NULL, task1, NULL); // Створюємо потоки

pthread_create (&ThreadB, NULL, task2, NULL); // Додаткова обробка

pthread_join (ThreadA, NULL); // Очікує завершення потоку

pthread_join (ThreadВ, NULL); // Очікує завершення потоку

return (0); }


В лістінгу 1 робимо акцент на визначенні колекції інструкцій для основ­ного потоку. Основним в даному випадку є керуючий потік, який оголошує два робочих потоки ThreadA і ThreadB. За допомогою функції pthread_create () ці два потоки пов’язуються з задачами, які вони повинні виконувати (task1, task2). Тут (для простоти прикладу) ці задачі всього лише відправляють повідомлення в стандартний вихідний потік, але зрозуміло, що вони могли вирішувати більш корисні задачі. При виклику функції pthread_create () потоки моментально при­ступають до виконання призначених їм задач. Основний потік очікує до тих пір, доки не завершать роботу обидва робочих потоки. Діаграма послідовнос­тей, що відповідає програмі (лістінг 1), подано на рис. 11. Зверніть увагу на те, відбувається з потоками виконання при виклику функції pthread_create () і pthread_join ().

На рис. 11 показано, що виклик функції pthread_create () є причиною роз­галудження, або реалізації ²вилки² в основному потоці виконання, в результаті чого створюються два додаткових потоки (по одному для кожної задачі), які виконуються паралельно. Функція pthread_create () завершується відразу після створення потоків. Ця функція призначена для створення асинхронних потоків. Це означає, що , як робочі потоки, так і основний потік, виконують свої інстру­к­ції незалежно один від одного. Функція pthread_join () заставляє основний по­тік очікувати до тих пір, доки всі робочі потоки завершаться і ²приєднаються² до основного.

4.2. Компіляція та компоновка багатопоточних програм

Всі багатопоточні програми, які використовують бібліотеку потоків POSIX, повинні містити заголовок:

<pthread.h>

Для компіляції багато поточного додатку в середовищі UNIX і Linux з допомогою компіляторів командної стрічки g++ або gсс необхідно з компонува­ти його з бібліотекою Рthread. Для задання бібліотеки використовуйте опцію -1. Так,команда

-1pthread

забезпечить компоновку вашого додатку з бібліотекою, яка узгоджується з ба­гатопоточним інтерфейсом, який визначається стандартом POSIX 1003.1с. Біб­ліотеку Рthread, libpthread.so, необхідно розмістити в каталог, в якому зберіга­є­ться системна стандартна бібліотека, як правило це /usr/lib. Якщо вона буде знаходитися в нестандартному каталозі, то для пошуку компілятора в заданому каталозі до пошуку в стандартних, використайте опцію –L. За командою

g++ -o blackboard – L / src / local / lib blackboard.cpp – lpthread

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