МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ Факультет «Вычислительная техника» Кафедра «Компьютерные технологии» Направление подготовки 01.03.02 Прикладная математика и информатика РЕАЛИЗАЦИЯ СИНХРОННОГО ДОСТУПА К ОБЩИМ ДАННЫМ В ЗАДАЧАХ ПАРАЛЛЕЛЬНОЙ ОБРАБОТКИ МАССИВОВ (Наименование выполняемой работы) по дисциплине «Технологии параллельного программирования» ОТЧЕТ по лабораторной работе № 3, вариант № 10 (Обозначение документа) Студент гр. 21ВГ1 Преподаватель к.ф.-м.н, доцент (Подпись) Балашов Е.Э. (Фамилия И.О.) (Подпись) Абрамов И.А. (Фамилия И.О.) 2023 Цель работы: Освоение приемов использования служб синхронизации при параллельном доступе к разделяемым данным. Задание: Реализовать описанный подход параллельного вычисления суммы элементов массива. Для синхронизации доступа к разделяемой переменной следует использовать мьютекс. Выполнить компиляцию и запуск программы. Разобрать результаты работы программы. Изменить текст программы для выполнения обработки массива согласно заданию (см. варианты). Вариант задания: 10. Дан одномерный целочисленный массив A. Найти в этом массиве сумму максимального среди элементов с чётными индексами и минимального среди элементов с нечётными индксами. Объявление функций для задания: #include <pthread.h> #include <iostream> #include <ctime> #include <sys/time.h> using namespace std; #define THR 2 typedef int Res; struct DataParam{ int *vec,m, n,ind; }; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int summa=0; int summa2=0; int Max=-100; int Min=100; void* task(void *data) { struct DataParam D =*(DataParam*)data; Res *r = new Res; *r=0; for(int i=D.m; i<D.n; i++){ pthread_mutex_lock(&mutex); summa+=D.vec[i]; if (D.vec[i] % 2 == 0){ if (Max<D.vec[i]){ Max=D.vec[i]; } 2 } if (D.vec[i] % 2 == 1){ if (Min>D.vec[i]){ Min=D.vec[i]; } } pthread_mutex_unlock(&mutex); } summa2=Max+Min; return NULL; } int main(int argc, char* argv[]) { srand(time(NULL)); pthread_t *threads; int sum = 0; int j, n, i, rc,pc; n = atoi(argv[1]); int *mas = new int[n]; threads = (pthread_t*) malloc(THR * sizeof(pthread_t)); for (i = 0; i < n; i++) { mas[i] = rand() % 11; cout << mas[i] << "\t"; } cout << "\n"; struct DataParam data[THR]; int size = n/THR; int offset = 0; Res *res; for (i = 0; i < THR; i++) { data[i].vec = mas; data[i].m = offset; data[i].n = offset + size ; rc = pthread_create(&threads[i], NULL, &task, (void *)&data[i]); cout<<data[i].vec<<"\n"; }; for (i = 0; i < THR; i++) { rc = pthread_join(threads[i], NULL); }; cout << "Сумма элементов массива: " << summa << endl; cout << "Сумма максимального четного и минимального нечетного: " << summa2 << endl; pthread_mutex_destroy(&mutex); 3 return EXIT_SUCCESS; } Тестирование объявленных функций: Вывод: В ходе выполнения лабораторной работы мы освоили приемы использования служб синхронизации при параллельном доступе к разделяемым данным. 4