/
MaestroN
/
Eltex_Homework
Обзор
Документация
Войти
/
MaestroN
/
Eltex_Homework
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Task_9/Task9.2.c
76 строк
4 KB
nikita_shub
Добавление задания 9 Процессы и потоки
28 янв 2025, 15:30
28 янв 2025, 15:30
fc4d1c8
Код
Авторство
О чём код?
/*2. Простое разделение вычислительной задачи между потоками Цель: Закрепить базовые навыки работы с потоками через POSIX threads, разделив вычислительную задачу между несколькими потоками. • Программа должна вычислять сумму квадратов чисел от 1 до N (где N — не слишком большое число, например, 1000) с разделением диапазона на два или три поддиапазона. • Каждому потоку поручается посчитать сумму квадратов для своего диапазона. • Главный (основной) поток после завершения работы всех потоков суммирует полученные результаты и выводит итоговую сумму. • Передача вычисленных значений может осуществляться через глобальные переменные с простой синхронизацией, либо через возвращаемое значение потока (через механизм pthread_join()). Рекомендации: • При разделении диапазона обратите внимание на корректное определение границ, чтобы все числа были обработаны и не было перекрытий. • Если планируется использовать глобальную переменную, можно применять мьютекс, хотя в этом простом примере можно обойтись и без него. • Результаты каждого потока можно сохранить в отдельной переменной, а затем вызвать pthread_join() и суммировать.*/ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define N 1000 // Структура для передачи данных в поток typedef struct { int start; // Начало диапазона int end; // Конец диапазона int result; // Результат вычислений } thread_data_t; // Функция для потоков void* thread_func(void* arg) { thread_data_t* data = (thread_data_t*)arg; // объявляем указатель data и приводим указатель arg к типу thread_data_t*, чтобы получить доступ к полям структуры thread_data_t с помощью указателя data data->result = 0; // обращение к полю структуры result // Вычисление суммы квадратов в заданном диапазоне for (int i = data->start; i <= data->end; i++) { data->result += i * i; } pthread_exit(NULL); } int main() { pthread_t thread1, thread2; // Инициализация потоков thread_data_t data1, data2; // Данные для потоков // Определение диапазонов для потоков data1.start = 1; data1.end = N / 2; // Первый поток обрабатывает первую половину data2.start = (N / 2) + 1; // Второй поток обрабатывает вторую половину data2.end = N; // Создание потоков if (pthread_create(&thread1, NULL, thread_func, (void*)&data1) != 0) { perror("Ошибка при создании потока 1"); return EXIT_FAILURE; } if (pthread_create(&thread2, NULL, thread_func, (void*)&data2) != 0) { perror("Ошибка при создании потока 2"); return EXIT_FAILURE; } // Ожидание завершения потоков pthread_join(thread1, NULL); pthread_join(thread2, NULL); // Суммирование результатов int total_sum = data1.result + data2.result; printf("Сумма квадратов от 1 до %d равна: %d\n", N, total_sum); return 0; }