为什么sum这里要临界区?
先请看代码:
#include <windows.h>
#include <stdio.h>
#include <time.h>
static long num_steps=1000000000;
const int gNumThreads = 2;
double step = 0.0;
double pi = 0.0,sum = 0.0;
CRITICAL_SECTION gCS;
DWORD WINAPI threadFunction(LPVOID pArg)
{
int myNum = *((int *)pArg);
double partialSum = 0.0, x; // local to each thread
for ( int i=myNum; i<num_steps; i+=gNumThreads )
{
x = (i+0.5)*step;
partialSum = partialSum + 4.0/(1.0 + x*x); //compute partial sums at each thread
}
EnterCriticalSection(&gCS);
sum += partialSum; // add partial to global final answer
LeaveCriticalSection(&gCS);
return 0;
}
int main()
{
clock_t start ,stop ;
start = clock() ;
InitializeCriticalSection(&gCS) ;
HANDLE hThreads[gNumThreads] ;
int tNum[gNumThreads];
step = 1.0/(double) num_steps;
for(int i=0; i<gNumThreads; i++){
tNum[i] = i ;
hThreads[i] = CreateThread( NULL,
0,
threadFunction,
&tNum[i],
0,
NULL);
}
WaitForMultipleObjects(gNumThreads,hThreads,TRUE,INFINITE) ;
DeleteCriticalSection(&gCS) ;
printf("sum = %12.9lf\n",sum) ;
pi = step * sum ;
stop = clock() ;
printf("pi=%12.9lf\n",pi) ;
printf("The time of calculation was %f seconds\n",((double)(stop - start)/1000.0));
system("pause") ;
return 0 ;
}