Багатопоточність у С/C++
Автор: Diana Demiuk • Декабрь 29, 2023 • Практическая работа • 1,584 Слов (7 Страниц) • 142 Просмотры
Міністерство освіти і науки України
Вінницький національний технічний університет
Факультет інтелектуальних інформаційних технологій та автоматизації
Кафедра Комп’ютерних наук
Практична робота №2
з дисципліни «Технології розподілених систем та паралельних обчислень»
Тема: «Багатопоточність у С/C++»
Виконала: студентка групи 2КН-21б: Демюк Д.Я.
Перевірив: доцент: Денисюк В.О.
Вінниця, 2023р
Практична робота №2
Мета: Практичне вивчення поняття потоку виконання, операцій над потоками і стандартних засобів синхронізації. Ознайомлення з моделями взаємодії потоків.
Основні теоретичні відомості
У багатьох завданнях можна виділити ряд підзадач, кожну з яких можливо вирішити або незалежно від інших підзадач, або з їх мінімальною кооперацією. При цьому підзадачі виконуються конкурентно (в однопроцесорній системі) або паралельно в многопроцессорной системі. В багатопотоковій моделі кожна така підзадача існує як індивідуальний потік виконання всередині одного і того ж процесу. При цьому процес ділиться на дві частини. Одна частина містить ресурси, використовувані через всю програму, такі як програмний код і глобальні дані. Інша містить інформацію, що відноситься до стану виконання.
В операційній системі GNU / Linux підтримка потоків забезпечена певним набором типів мови програмування С і набором функцій для виконання операцій над потоками. Підтримка потоків виконання реалізована у вигляді набору заголовків файлів і бібліотеки, яка підключається до програми на етапі її компонування. Прототипи більшості функцій для маніпуляції з потоками описуються у файлі pthread.h. Нижче наводяться прототипи найбільш часто використовуваних функцій разом з поясненням їх синтаксису і виконуваних ними дій.
int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*routine) (void*), void* arg); - створює потік з атрибутами, зазначеними в attr. При передаванні 0 в якості attr будуть використані атрибути по замовчуванню, які підходять для більшості випадків. У вихідний параметр thread заноситься дескриптор створеного потоку. Створений потік виконує зазначену функцію routine, якій при виклику буде передано значення параметра arg. void pthread_exit (void *value); - Завершує потік, який викликається і повертає значення value потоку, що очікує завершення даного потоку. pthread_t pthread_self (); - Повертає дескриптор потоку, який викликав.
int pthread_join (pthread_t thread, void** value_ptr); - Переводить викликає потік в стан очікування завершення зазначеного потоку thread. В параметр value_ptr (якщо він відмінний від 0) заноситься результат виконання завершеного потоку.
2. Засоби синхронізації потоків
Як відомо, в рамках програми всі потоки виконуються в одному адресному просторі. У зв'язку з цим постає проблема спільного використання загальних
змінних. Для її вирішення потрібні кошти, які дозволяють розмежувати доступ потоків до таких поділюваних змінних, або до ресурсів, оскільки в один момент часу тільки єдиний потік повинен працювати з певним ресурсом. Сформульована задача має назву забезпечення взаємовиключення, а ділянки програмного коду, в яких потоки виконують операції з ресурсами, які розділяються, називаються критичними секціями.
З іншого боку, потокам може знадобитися кооперація не по данним, а по виконуваним діям. Прикладом такої кооперації є ситуація, при якій потоку для продовження своєї роботи потрібен результат виконання іншого потоку.
У наведеному випадку потік повинен синхронізувати свої дії з іншим(и) потоками по готовності даних. Іншим прикладом кооперації по діям є необхідність виконання деякої операції тільки одним з багатьох потоків, причому яким з них апріорно невідомо. Для вирішення розглянутих завдань та інших, подібних їм, використовуються спеціальні засоби синхронізації потоків. Основні з них – це м'ютекси, семафори і умовні змінні. Синхронізація та взаємовиключення забезпечуються за рахунок атомарності виконуваних операцій над м'ютексами і семафорами. Атомарної називають операцію, яка не може бути перервана в ході свого виконання.
М'ютекс дозволяє потокам управляти доступом до даних. При використанні мьютекса тільки один потік в певний момент часу може заблокувати мьютекс і отримати доступ до ресурсу («ліцензію» на його використання).
При завершенні роботи з ресурсом потік повинен повернути «ліцензію», розблокувавши мьютекс. Якщо який-небудь потік звернеться до вже заблокованого м'ютексу, то він буде змушений чекати розблокування мьютекса потоком, що володіє їм.
Прототипи функцій для виконання операцій над м'ютексами описуються у файлі pthread.h. Нижче наводяться прототипи найбільш часто
...