/
bvs22
/
draft
Обзор
Документация
Войти
/
bvs22
/
draft
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
threads/sum_arrays.c
80 строк
2 KB
bvs22
1
01 фев 2025, 15:17
01 фев 2025, 15:17
cef82ac
Код
Авторство
О чём код?
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sys/types.h> #define N 1000 #define THREADS 2 typedef struct { int start; int end; long long *total_sum; pthread_mutex_t *mutex; } thread_data; // Функция, которую будет выполнять каждый поток void *sum_func(void *arg) { thread_data *data = (thread_data *)arg; long long partial_sum = 0; for (int i = data->start; i <= data->end; i++) { partial_sum += (long long)i * i; } // Блокируем мьютекс перед обновлением общей суммы pthread_mutex_lock(data->mutex); *(data->total_sum) += partial_sum; pthread_mutex_unlock(data->mutex); pthread_exit(NULL); } int main() { pthread_t threads[THREADS]; thread_data thread_args[THREADS]; long long total_sum = 0; pthread_mutex_t mutex; // Инициализация мьютекса if (pthread_mutex_init(&mutex, NULL) != 0) { fprintf(stderr, "Ошибка при инициализации мьютекса\n"); return 1; } int chunk_size = N / THREADS; int remainder = N % THREADS; int current_start = 1; // Создание потоков for (int i = 0; i < THREADS; i++) { thread_args[i].start = current_start; // Распределяем остаток между первыми потоками thread_args[i].end = current_start + chunk_size - 1 + (i < remainder ? 1 : 0); current_start = thread_args[i].end + 1; thread_args[i].total_sum = &total_sum; thread_args[i].mutex = &mutex; int result = pthread_create(&threads[i], NULL, sum_func, (void *)&thread_args[i]); if (result != 0) { fprintf(stderr, "Ошибка при создании потока %d\n", i); // Уничтожение мьютекса перед выходом pthread_mutex_destroy(&mutex); return 1; } } // Ожидание завершения потоков for (int i = 0; i < THREADS; i++) { pthread_join(threads[i], NULL); } // Уничтожение мьютекса pthread_mutex_destroy(&mutex); printf("sum = %lld\n", total_sum); return 0; }