Julila
@Julila
вечный студент / german version

Как посчитать сумму с помощью thread?

Привет всем.
У меня есть сумма

S = 1 / n*n
n от 1 до 100001

Посмотрите пожалуйста на мою жалкую попытку посчитать это с помощью потоков. Колличество потоков передается в шапке bool sum(unsigned int number_threads)

Я не знаю где прописать границы приблежения от 1 до 1000001.

Задание
Посчитайте сумму от n0 till n1 паралельно, быстро и thread-safe . (Wihout main-Thread)

#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <cstdlib>
#include <algorithm>
 
#include <mutex>
using namespace std;
mutex m_sum;
 
void Work( int &sum , int n0, int n1 ){  // передавать границы в Work ????? 
    unique_lock<mutex> lck {m_sum}; 
    double tmp ; 
    for ( int j = n0 ; j>n1 ; j++) {
         tmp = 1/(n*n);
            sum=sum+tmp; } ///// _-------> ???? 
    lck.unlock();}
    
bool sum(unsigned int number_threads)
 
{
    const double pi = 3.14159265358979323846264338327;
    const double exact = pi*pi/6.0; //// ___ проверка решения 
    
    unsigned int n0 = 1;
    unsigned   int n1 = 1000001;  // --- > собственно границы
    double s=0;
 
    thread* t = new thread[number_threads];
    
   for(  unsigned int i = 0; i < number_threads; ++i){
      
        t[i] = thread(Work, std::ref(s), n0, n1);
    }
    
      for(  unsigned int i = 0; i < number_threads; ++i){
        t[i].join();    }
    
    
    cout << "sum=" << s << " " << fabs(s-exact) << endl;
    return fabs(s-exact)<1e-4;
}
  • Вопрос задан
  • 716 просмотров
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Вы в каждом потоке считаете полную сумму, а надо в каждый поток передавать свой диапазон n0-n1, отличный от других. И избавьтесь от мьютексов - выделите для каждого потока свое место куда он будет складывать сумму. Это намного увеличит производительность. После того как все потоки отработают в главном останется только сложить суммы.
Кстати, можете посмотреть в сторону OpenMP - эта библиотека для подобных задач хорошо подходит.
Ответ написан
Julila
@Julila Автор вопроса
вечный студент / german version
#include <iostream>
#include <thread>
#include <vector>
#include <cstdlib>
#include <algorithm>

#include <mutex>
using namespace std;
mutex m_sum;
void Work( double &sum ){ 	
    unsigned int n0 = 1;
    unsigned   int n1 = 1000001;
    double tmp; 
unique_lock<mutex> lck {m_sum}; 
 
	for (unsigned int j = n0 ; j<n1 ; j++) {
	tmp = 1.0/(j*j);
			double sum=sum+tmp; }
		cout << "b" ;	
	
	lck.unlock();}
	
bool sum(unsigned int number_threads)

{
    const double pi = 3.14159265358979323846264338327;
    const double exact = pi*pi/6.0;
    
       double s=0;

    thread* t = new thread[number_threads];
    
   for( long unsigned int i = 0; i < number_threads; ++i){
	  
 	t[i] = thread(Work, std::ref(s) );
	}
	
	  for( long unsigned int i = 0; i < number_threads; ++i){
 	t[i].join();
	}
 	delete []t;
 	cout << "sum=" << s;
    cout << "sum=" << s << " " << fabs(s-exact) << endl;
    
    return fabs(s-exact)<1e-4;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽