1、 求 PI 值一、程序代码:非多线程:#include#include #include const long num_steps=10000000;double step,pi;void main()clock_t start, stop; start = clock(); int i;double x,sum=0.0;step=1.0/(double)num_steps;for(i=0;i#include #include const long num_steps = 10000; const int gNumThreads = 15; double gStep = 0.0;double
2、gPi = 0.0;CRITICAL_SECTION gCS;DWORD WINAPI threadFunction(LPVOID pArg) int myNum = *(int *)pArg); double Sum = 0.0, x; / local to each thread for ( int i=myNum; inum_steps; i+=gNumThreads )/每次 gNumThreads 个线程运行 x = (i + 0.5f) / num_steps; Sum += 4.0f / (1.0f + x*x); /在每个线程计算 PI 值 EnterCriticalSecti
3、on(gPi += Sum * gStep; LeaveCriticalSection(return 0; void main() HANDLE threadHandlesgNumThreads; int tNumgNumThreads;clock_t start, stop; start = clock(); printf(“PI=“); InitializeCriticalSection( gStep = 1.0 / num_steps; for ( int i=0; igNumThreads; +i ) /创建线程 tNumi = i; threadHandlesi = CreateTh
4、read( NULL, 0, threadFunction, (LPVOID) WaitForMultipleObjects(gNumThreads, threadHandles, TRUE, INFINITE); DeleteCriticalSection(stop = clock(); printf(“%12.20fn“, gPi ); printf(“计算 PI 的时间为: %f 秒n“,(double)(stop - start)/1000.0);二、设计思想根据积分公式 即可求得值根据多线程并行执行思想可以将一个程序的执行顺序互不影响的步骤分开执行,即可以将这些每一个步骤都分为一个线
5、程,这样可以大幅度提高程序执行时间,但如果可并行执行的步骤过少时,时间减少的并不明显。本例由于求值时每个循环中先后并不影响,因此可以做成多线程并行执行。即非多线程时每次循环一次一次的执行,但当做成多线程时,每次相当于并行执行gNumThreads 次,所以当循环次数过多时可以显著减少程序的执行时间。三、运行结果:非多线程:num_steps=10000num_steps=10000000;多线程:num_steps = 10000gNumThreads = 15gNumThreads = 25num_steps = 10000000gNumThreads = 15gNumThreads = 25四、心得体会:感觉多线程的效率比较高,很明显执行时间减少了。虽然有些代码不是自己写的,但我还是收获很大的,至少我初步了解了多线程的一些知识。