Uploaded by asdasd adsfsadf

Laboratornaya rabota 3

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ
ФЕДЕРАЦИИ
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ
Факультет «Вычислительная техника»
Кафедра «Компьютерные технологии»
Направление подготовки 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
Download