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

利用中值积分定理计算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);
}