2014-04-24 32 views
0

我是使用Pthreads庫的C中的線程的新手。我使用pthread_exit(...)返回值,並在main等待它在加入。事情是,我正在測試它,並用兩個線程,其中一個的結果是好的,但另一個是沒有意義的東西。作爲例子,兩個線程都必須返回32,其中一個是OK,但另一個返回-123456789。有人可以幫助我?從C中的線程返回一個值C

void *contar(void *arg){ //funcion thread 
int i,j=0; 
int *aux = (int *) arg; 
int id = *aux; 
int strip = N/T; 
int inicio = id*strip ; 
int fin = inicio + strip; 
printf("%d %d %d \n",id,inicio,fin); 
for(i=inicio;i<fin;i++){ 
    if(VEC[i] == X){ 
     j++;   
    } 
} 

pthread_exit(&j); 
} 


int main(int argc,char* argv[]){ 
int i,j,k; 
void *res; 
int *aux; 
int acum=0; 

    N = (argc > 1)? atoi(argv[1]):n; 
    T = (argc > 2)? atoi(argv[2]):t; 
    X = (argc > 3)? atoi(argv[3]):x; 
    //Aloca memoria para el vetor 
    VEC =(int*)malloc(sizeof(int)*N); 
    aux=(int*)malloc(sizeof(int)*T); 

    //Aloca memoria para threads 
    threads=(pthread_t*) malloc(T*sizeof(pthread_t)); 

    //Inicializa el vector VEC 
    for(i=0;i<N;i++){ 
    VEC[i]=1; 
    } 

    pthread_attr_t attr; 
    pthread_attr_init (&attr); 

    for(i=0;i<T;i++){ 
    aux[i]=i; 
    pthread_create(&(threads[i]),&attr,contar,&(aux[i])); 
    } 

    for(i=0;i<T;i++){ 
    pthread_join((threads[i]),&res); 
    printf("%d \n",*(int *)res); 
    } 

free(VEC); 
free(threads); 
free(aux); 
free(res); 
return(0); 
} 

回答

3

Open Group pthread_exit documentation

一個線程終止後,獲得了線程的本地(自動)變量的結果是不確定的。因此,對現有線程的局部變量的引用不應該用於pthread_exit()value_ptr參數值。

您正在返回地址j,這是您的線程函數中的局部變量。這是一個很大的禁忌。

至於如何解決這個問題,有幾個解決方法可以立即解決。


首先是使用全局變量作爲返回值,每個線程一個。這通常也用於線程ID。


第二種是使用參數傳遞到線程。目前,你傳入一個整數數組,但你可以很容易地傳入一個包含整數加上的任意結構來存儲返回代碼。線程可以在返回之前填充結構的那部分。


第三,根據intvoid*類型是如何「兼容」是在您的實現,你可以簡單地使用指針本身,傳回值。這將產生線程執行:

pthread_exit ((void*)j); 

和主線轉換回:

printf ("%d\n", (int)res); 

其中,第二個可能是「乾淨的」,涉及既不思慮的較小全局或潛在的可疑的演員。

+0

那麼我應該返回什麼? – user3420326

+1

@ user3420326,我已經添加了一些關於如何解決這個問題的選項。可能有其他人,但這應該是一個足夠好的開始。 – paxdiablo