Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB / WORK_5 / лаб_раб_5

.pdf
Скачиваний:
33
Добавлен:
20.02.2019
Размер:
151.67 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Кафедра программной инженерии и вычислительной техники

Отчёт

по лабораторной работе №5 на тему:

«Разработка многопоточного приложения под Windows»

по дисциплине «Операционные системы»

Выполнил: студент группы ИКВТ-61, Козырев А.Б.

«

 

»

 

 

2018

г. ___________/А.Б. Козырев/

Принял: __к.т.н.

Дагаев А.В.

«

 

»

 

 

2018

г. ___________/_А.В. Дагаев/

САНКТ-ПЕТЕРБУРГ

2018

Задание: разработать многопоточное приложение с применением критических секций, приоритетов, методов синхронизации потоков.

Объект синхронизации: мьютекс.

Исходный код:

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

static volatile int counter = 0; static pthread_mutex_t myMutex;

void *mutex_testing(void *param)

{

int i;

for(i = 0; i < 5; i++)

{

pthread_mutex_lock(&myMutex); counter++;

sleep(1);

printf("thread [%i] entered\tcounter = %i\n", *reinterpret_cast<int*>(param), counter);

pthread_mutex_unlock(&myMutex);

}

}

int main()

{

int one = 1, two = 2, three = 3; pthread_t thread1, thread2, thread3; pthread_mutex_init(&myMutex,nullptr);

pthread_create(&thread1, nullptr, mutex_testing, reinterpret_cast<void*>(&one));

pthread_create(&thread2, nullptr, mutex_testing, reinterpret_cast<void*>(&two));

pthread_create(&thread3, nullptr, mutex_testing, reinterpret_cast<void*>(&three));

pthread_join(thread1, nullptr); pthread_join(thread2, nullptr); pthread_join(thread3, nullptr); pthread_mutex_destroy(&myMutex); return 0;

}

Функция sleep(1) заставляет потоки засыпать после её выполнения на 1 с, симулируя тем самым другие задачи. В этом примере, из-за отсутствия синхронизации через блокировку мьютексами, потоки инкрементируют счётчик «наперегонки».

Если раскомментировать критическую секцию мьютекса myMutex, то «борьба за счётчик» будет остановлена, поэтому он будет инкрементировать только одним потоком до окончания критической секции. При этом данный поток может не успеть повторить итерацию, как видно из примера:

Рассмотрим работу программы более подробно:

1.Счётчик count инициализируется нулём;

2.Объявляется статическая переменная на мьютекс;

3.Функция main() создаёт три потока и передаёт их в функцию mutex_testing();

4.Далее функция main() ожидает окончания работы каждого из потоков и уничтожает объект синхронизации – мьютекс myMutex;

5.Каждый из трёх потоков заходит в критическую секцию в цикле for и увеличивает счётчик на 1;

6.После 5 итераций, поток завершает свою работу.

Если не использовать мьютекс, то потоки будут инкрементировать счётчик одновременно, а затем беспорядочно выводить сообщения на экран. Это – типичный пример data race problem.

Вывод:

Врезультате мы достигли следующего:

1.Научились работать с потоками в системе Windows, также применили знания для написания программы;

2.Повторили материал по потокам ввода-вывода, стандартным конструкциям языка C++;

3.Использовали mutex - аналог одноместного семафора, служащий в программировании для синхронизации одновременно выполняющихся потоков;

Соседние файлы в папке WORK_5