#include #include #include #include #include #include #include using namespace std; const int THREAD_COUNT{10}; const int COUNT_LIMIT{200'000'000}; const int KILL_LOOP{1}; void ThreadFunction (int id, atomic & pi, const int nThread){ //void ThreadFunction (int id, double & pi, const int nThread){ int i; float signTerm = 1; double sum ; for(int j =0; j < KILL_LOOP; ++j) { sum = 0; for(i = id * 2 + 1; i < COUNT_LIMIT; i += 2*nThread) { if (i%4 ==1) { signTerm = 1; } else { signTerm = -1; } sum = sum + signTerm *4.0/static_cast(i); //pi += signTerm *4.0/static_cast(i); //pi.fetch_add( signTerm *4.0/static_cast(i)); } } pi.fetch_add(sum); return ; } int main() { vector threads; atomic pi{4}; //double pi{4}; for(int i = 0; i < THREAD_COUNT; ++i) { thread t(ThreadFunction, i+1, ref(pi), THREAD_COUNT); threads.push_back(move(t)); } for( int i = 0; i < THREAD_COUNT; ++i) { threads[i].join(); } cout << setprecision(10); cout << "Pi is approximately " << pi << endl; return 0; }