1. Вступ до паралельного програмування. Паралельні потоки POSIX

POSIX Threads або Pthread — стандарт POSIX реалізації нитей виконання, який визначає API для створення та управління ними.

Бібліотеки, які реалізують цей стандарт та його функції, звичайно називаються Pthreads (функції мають приставку «pthread_»). Найбільш широко використовуються для Unix-подібних операційних систем, таких як Linux чи Solaris, також існує реалізація для Microsoft Windows (Pthreads-w32).

Pthreads визначає набір типів данихфункцій і констант в форматі мови програмування C. Вони описані в файлі заголовку pthread.h і реалізовані у вигляді бібліотеки.

Всі процедури Pthreads мають назви з префіксом "pthread_" і можуть бути розділені на 4 категорії за призначенням:

POSIX API для семафорів працює з потоками POSIX, але не є частиною стандарту роботи з потоками, визначається в додатковому стандарті POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993). Всі процедури для роботи з семафорами, відповідно, мають префікс "sem_" замість "pthread_".

Основні функції стандарту

  • Типи даних:
    • pthread_t: дескриптор потоку
    • pthread_attr_t: набір атрибутів потоку
  • Функції управління потоками:
    • pthread_create(): створення потоку
    • pthread_exit(): завершення потоку
    • pthread_cancel(): відміна потоку
    • pthread_join(): блокування потоку до завершення іншого потоку, вказаного у виклиці функції
    • pthread_detach(): звільнити ресурси зайняті потоком (якщо потік виконується, звільнення ресурсів відбудеться після його завершення)
    • pthread_attr_init(): ініціалізація структури атрибутів потоку
    • pthread_attr_setdetachstate(): вказівка системі, що вона після завершення потоку може звільнити ресурси, зайняті потоком
    • pthread_attr_destroy(): звільнення пам'яті від структури атрибутів потоку (знищити дескриптор)
  • Функції синхронізації потоків:
    • pthread_mutex_init (), pthread_mutex_destroy (), pthread_mutex_lock (), pthread_mutex_trylock (), pthread_mutex_unlock (): за допомогою м'ютексів
    • pthread_cond_init(), pthread_cond_signal, pthread_cond_wait(): за допомогою умовних змінних

ЗАВДАННЯ

Задача 1. Робота з декількома джерелами даних

Розробити програму, яка використовуючи потоки POSIX буде паралельно зчитувати дані із заданого переліку джерел даних та обчислювати їх кількісні характеристики. Для цього необхідно заздалегідь підготувати файли з текстовою та чисельною інформацію. Потоки, що оброблюють текстові файли повинні обчислити статистику цих файлів (кількість символів, слів, знаків пунктуації, абзаців тощо). Потоки, що оброблюють числову інформацію відповідні статистичні дані для числових рядів (середнє, максимальне та мінімальне значення, кількість додатних і від'ємних чисел тощо). Кожен потік після завершення роботи повинен опублікувати на екрані повідомлення з обчисленною інформацією.

Задача 2. Робота зі спільною областю пам'яті

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