2016-09-24 3 views
-5

У меня есть программа на C++, которая оценивает значение PI. Как разделить задачи между 2 или 4 потоками?Как сделать эту программу на C++ многопоточной?

int main(int argc, char** argv) 
{ 
    double N = 10000000 
    int i, K = 0; 
    float pi; 

    srand(time(NULL)); 

    for(i = 0; i < N; ++i) 
    { 
     double x = rand()/(double)INT_MAX; 
     double y = rand()/(double)INT_MAX; 

     if (x*x + y*y < 1) 
     { 
      K++; 
     } 
    } 

    pi = K*4/N; 

    return 0; 
} 
+0

заменить/(двойной) N с константой * idN и заменить pow с x * x и заменить (double) INT_MAX двойной константой, чтобы иметь большую скорость перед многопоточным чтением. –

+2

Имейте один локальный аккумулятор на поток и результат результата в конце. –

+0

Почему вы делите INT_MAX? Этот алгоритм работает вообще? –

ответ

2

Я бы вместо этого использовал потоки C++ 11, потому что это проще для новичков.

Вот код.

double PiComputation::Random(){ 
    std::lock_guard<std::mutex> lock(mut_rand); 
    return ((double)dis(gen)/ (double) INT32_MAX); 
} 

double PiComputation::computePiSubTask(int nbSimuls){ 
    double x, y; 
    auto nbOk=0; 
    for (int i=0;i<nbSimuls;++i){ 
     x=Random(); 
     y=Random(); 
     if (x*x+y*y <1){ 
      nbimulsOk++; 
     } 
    } 
    return nbOk; 
} 

double PiComputation::ComputePi(){ 
    nbimulsOk=0; 
    int nbSubTaks=2; 
    int nbSimuls1=N/2; 
    int nbSimuls2=N-N/2; 

    std::thread first (&PiComputation::computePiSubTask, this, nbSimuls1); 
    std::thread second (&PiComputation::computePiSubTask, this, nbSimuls2); 



    first.join(); 
    second.join(); 

    return 4*nbimulsOk/(double) N; 
} 
PiComputation::PiComputation(void):N(100000000) 
{ 

    gen=std::mt19937 (rd()); 
    dis= std::uniform_int_distribution<> (1, INT32_MAX); 
} 


PiComputation::~PiComputation(void){ 
} 

выход при вызове его: 3,1416770800000000

Обратите внимание, что есть замок на генератор случайных чисел, так что это многопоточный, но это может быть МЕДЛЕННЕЕ из-за его узкое

+0

Я попробую, спасибо! –