2013-10-02 107 views
2

目前我正在研究一個使用線程來計算平方根總和的程序。我的程序工作正常,但其中一個要求是使用主線程來查找初始值,並且一旦我從main調用函數Void * calc,程序就會中斷。有沒有某種方法可以進行這樣的函數調用?這是因爲函數是一個指針嗎?任何幫助表示讚賞。從主C中調用void *函數C

#include <pthread.h> 
#include <stdio.h> 
#include <math.h> 
#include <unistd.h> 
#define NUM_THREADS 3 
int ARGV; 
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 
double total = 0; 


void *calc(void* t){ 
    int ph = (int)t + 1; 
    int start, stop, interval_size; 
    interval_size = ARGV/(NUM_THREADS + 1); 
    start = ((ph) * interval_size) + 1; 
    stop = (ph * interval_size) + 1; 
    double ttl; 
    int i; 

    for (i = start; i <= stop; i++){ 
      ttl = ttl + sqrt(i); 
      printf("Total Thread %i %lf\n", ph, ttl); 
     } 


    pthread_mutex_lock(&m); 
    total = total + ttl; 
    pthread_mutex_unlock(&m); 

    pthread_exit(NULL); 
} 

int main(int argc, char* argv[]) { 

    int i; 
    double ttl; 
    ARGV = atoi(argv[1]); 

    pthread_t ti[NUM_THREADS]; 

    calc(0); 
    for (i = 0; i < NUM_THREADS; i++) { 
     pthread_create(&ti[i], NULL, calc,(void *)i); 
    } 
    /*for (i = 1; i <= (ARGV/4) ; i++){ 
      ttl = ttl + sqrt(i);  
    }*/ 
    for (i = 0; i < NUM_THREADS; i++) { 
     pthread_join(ti[i], NULL); 
    } 

    total = total + ttl; 

    printf("Result: %lf\n", total); 
} 

該程序中斷,因爲在函數似乎只被調用一次,而不是每個線程使用函數。打印出的唯一值是一些模糊的不正確的數字。

+2

你是什麼意思的「程序中斷?」 – templatetypedef

+0

在for循環創建線程開始之前調用Calc。 – Ranma344

+0

當'i'是'int'時,我不喜歡'(void *)i''。在這種情況下,它可能按預期工作,但我相信這是實現定義的。 –

回答

8

您的calc功能確實pthread_exit。現在pthread_exit可以而且應該從主線程調用,所以這很好

要允許其他線程繼續執行,主線程 應該調用pthread_exit終止(),而不是出口(3)。

但由於發生這種情況的任何其他線索已創建之前,該方案只是退出直線距離,而沒有啓動其他線程。

+0

'main()'中有'pthread_exit()'? – WhozCraig

+0

@WhozCraig有一個直接的'calc(0)'。 – cnicutar

+0

啊..地獄鈴聲。很好的捕獲。 (+1) – WhozCraig