读书人

利用中值积分定律计算Pi值

发布时间: 2013-01-23 10:44:50 作者: rapoo

利用中值积分定理计算Pi值

利用中值积分定理计算Pi值

利用中值积分定律计算Pi值

串行算法:

利用中值积分定律计算Pi值

要多线程实现的话,我们主要是把for循环的计算过程分到几个线程中去,由于每次计算我们都要更新sum的值,就有可能发生一个线程已经更新了sum的值,而另一个线程读到的还是旧的sum值,所以在这里我们使用临界区,把sum放到临界区中,这样一次只能有一个线程访问和修改sum的值。

并行算法:

#include <windows.h>#include <stdio.h>static long num_steps=100000; const int numThreads = 4;double step, pi;CRITICAL_SECTION g_cs;double sum = 0.0;DWORD WINAPI countFunc(LPVOID pArg) {    double x;   int i;   int temp = *(int *)pArg;   int start = (temp*num_steps)/4;   int end = start + num_steps/4;   for (i=start; i<end; i++){  EnterCriticalSection(&g_cs);      x = (i+0.5)*step;      sum = sum + 4.0/(1.0 + x*x);\  LeaveCriticalSection(&g_cs);   }      return 0; }void main(){     int i;   HANDLE hThread[numThreads];   step = 1.0/(double) num_steps;      int tNum[numThreads];   InitializeCriticalSection(&g_cs);   for(i=0;i<numThreads;i++)   {   tNum[i] = i;   hThread[i] = CreateThread(NULL, 0, countFunc,(LPVOID)&tNum[i], 0, NULL );   }   WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);   DeleteCriticalSection(&g_cs);   pi = step * sum;   printf("Pi = %12.9f\n",pi);}


读书人网 >编程

热点推荐