/* * Дана последовательность натуральных чисел a0, ... * Создать многопоточное приложение для поиска суммы квадратов sum(a[i]^2. * В приложении вычисления должны выполнять два потока, работающие последовательно: * первый поток вычисляет квадраты чисел, второй – находит их сумму */ #include #include #include #include #include const unsigned int arrSize = 10000000; //const unsigned int arrSize = 500000000; //const unsigned int arrSize = 900000000; //const unsigned int arrSize = 700000000; double *A ; //последовательность чисел a0... //стартовая функция для второго потока void *summa(void *param) { double *sum = new double; *sum = 0 ; for(unsigned int i = 0 ; i < arrSize ; i++) { *sum += A[i]; //вычисление суммы } ///std::cout << "sum = " << *sum << "\n"; return (void *)sum ; } //стартовая функция для первого потока void *square(void *param) { double *rez; for(unsigned int i = 0 ; i < arrSize ; i++) { A[i] *= A[i] ; //вычисление квадратов } pthread_t threadS ; //создание второго потока pthread_create(&threadS, NULL, summa, NULL) ; //ждем завершения второго потока и передаем его результат главному потоку pthread_join(threadS, (void **)&rez) ; ///std::cout << "rez = " << *rez << "\n"; return (void *)rez ; } int main() { double *rez; //для записи окончательного результата // заполнение массива A A = new double[arrSize]; if(A == nullptr) { std::cout << "Incorrect size of vector = " << arrSize << "\n"; return 1; } for(int i = 0; i < arrSize; ++i) { A[i] = double(i); } pthread_t threadK ; //создание первого потока clock_t start_time = clock(); // начальное время pthread_create(&threadK, nullptr, square, nullptr) ; pthread_join(threadK, (void **)&rez) ; //ожидание завершения первого потока clock_t end_time = clock(); // конечное время //вывод результата std::cout << "Сумма квадратов = " << *rez << "\n" ; std::cout << "Сумма квадратов = " << std::setprecision(20) << *rez << "\n" ; std::cout << "Сумма квадратов = " << std::scientific << std::setprecision(std::numeric_limits::digits10 + 1) << *rez << "\n" ; std::cout << "Время счета = " << end_time - start_time << "\n"; delete[] A; return 0; }