2014-04-19 54 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)。