2014-04-19 34 views
0

我目前在做这个项目,我需要计算圆周率值PI值...的Windows线程API:计算与多线程

当指定只有一个线程完美的作品,我也得到3.1416 [ ...]但是当我指定解决过程中的2级或更多的线程我停下得到3.1416价值,这是我的代码:

#include <stdio.h> 
#include <time.h> 
#include <windows.h> 

//const int numThreads = 1; 
//long long num_steps = 100000000; 

const int numThreads = 2; 
long long num_steps = 50000000; 

double x, step, pi, sum = 0.0; 
int i; 

DWORD WINAPI ValueFunc(LPVOID arg){ 
    for (i=0; i<=num_steps; i++) { 
     x = (i + .5)*step; 
     sum = sum + 4.0/(1. + x*x); 
    } 

    printf("this is %d step\n", i); 
    return 0; 
} 

int main(int argc, char* argv[]) { 
    int count; 
    clock_t start, stop; 
    step = 1./(double)num_steps; 
    start = clock(); 

    HANDLE hThread[numThreads]; 
    for (count = 0; count < numThreads; count++) { 

      printf("This is thread %d\n", count); 
     hThread[count] = CreateThread(NULL, 0, ValueFunc, NULL, 0, NULL); 

    } 

    WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE); 

    pi = sum*step; 
    stop = clock(); 
    printf("The value of PI is %15.12f\n", pi); 
    printf("The time to calculate PI was %f seconds\n", ((double)(stop - start)/1000.0)); 

} 

指定2个线程,当我得到这个错误输出:

Wrong PI value

+0

在这种特殊情况下,不需要同步对象:只需让每个线程分别合计自己的部分总和,然后对每个线程的值进行求和即可。 –

回答

0

您需要使用互斥锁来访问由多个线程共享的数据,或者将数据保存到特定线程的本地数据,然后在所有线程完成时提供答案。

1

看来你的程序在使用两个线程的时候,允许两个线程直接操作全局/共享资源'sum'而没有任何同步保护。

换句话说,两个线程可以同时操纵'sum'。在任何点上'sum'的值都不会是预期的(即:因为它只有一个线程)。

你的程序需要在两个线程之间实现某种访问同步;如信号量,自旋锁,互斥锁,原子操作等。如果实施得当,这些功能将允许两个(或更多)线程共享单个任务(计算PI)。