/* * Дана последовательность натуральных чисел a0, ... * Создать многопоточное приложение для поиска суммы квадратов sum(a[i]^2. * В приложении вычисления должны независимо выполнять четыре потока. */ #include #include #include #include #include struct Package { double* array; // Указатель на начало области обработки int threadNum; // Номер потока double sum; // Формируемая частичная сумма } ; const unsigned int arrSize = 10000000; //const unsigned int arrSize = 500000000; //const unsigned int arrSize = 900000000; //const unsigned int arrSize = 700000000; double *A ; //последовательность чисел a0... //const int threadNumber = 1; // Количество потоков //const int threadNumber = 2; // Количество потоков const int threadNumber = 4; // Количество потоков //const int threadNumber = 8; // Количество потоков //стартовая функция для дочерних потоков void *func(void *param) { //вычисление суммы квадратов в потоке // Востановление структуры Package* p = (Package*)param; p->sum = 0.0; for(unsigned int i = p->threadNum ; i < arrSize; i+=threadNumber) { p->sum += p->array[i] * p->array[i]; } return nullptr; } int main() { double rez = 0.0 ; //для записи окончательного результата // заполнение массива 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 thread[threadNumber]; Package pack[threadNumber]; clock_t start_time = clock(); // начальное время //создание дочерних потоков for (int i=0 ; i