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