2012-10-08 48 views
0

這是我的pthread代碼問題。當我運行下面的命令:pthread應用程序中可能的競態條件(無法檢測到)

./run 1 
./run 2 
./run 4 

前兩個命令(一個線程和兩個線程)產生相同的輸出。然而,有4個線程(第三個命令),我看到不同的輸出。

現在,當我運行以下命令

valgrind --tool=helgrind ./run 1 
valgrind --tool=helgrind ./run 2 
valgrind --tool=helgrind ./run 4 

他們產生相同的輸出。輸出值是正確的。

我該如何進一步調查?

代碼看起來像

int main(int argc,char *argv[]) 
{ 
    // Barrier initialization 
    if(pthread_barrier_init(&barr, NULL, threads)) { 
    printf("Could not create a barrier\n"); 
    return -1; 
    } 
    int t; 
    for(t = 0; t < threads; ++t) { 
    printf("In main: creating thread %ld\n", t); 
    if(pthread_create(&td[t], NULL, &foo, (void*)t)) { 
     printf("Could not create thread %d\n", t); 
     return -1; 
    } 
    } 
    ... 
} 


void * foo(void *threadid) 
{ 
    long tid = (long)threadid; 
    for (i = (tid*n/threads)+1; i <= (tid+1)*n/threads; i++) { 
    printf("Thread %d, i=%d\n", tid, i); 
    for(largest = i, j = i+1; j <= n; j++) { 
     if(abs(a[j][i]) > abs(a[largest][i])) 
     largest = j; 
    } 
    for(k = i; k <= n+1; k++) 
     SWAP_DOUBLE(a[largest][k], a[i][k]); 
    for(j = i+1; j <= n; j++) { 
     for(k = n+1; k >= i; k--) 
     a[j][k] = a[j][k]-a[i][k]*a[j][i]/a[i][i]; 
    } 
    } 
    int rc = pthread_barrier_wait(&barr); 
    if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) { 
    printf("Could not wait on barrier\n"); 
    exit(-1); 
    } 
    printf("after barrier\n"); 
    ... 
} 

主循環(其遍歷ifoo())由線程數劃分。假設所有變量都被正確定義,因爲正如我所說的,1和2線程沒有問題。

+2

它可能有助於嘗試StackOverflow調試器:只需將與該問題直接相關的代碼段添加到您的問題中,其他人就會查看它。 – Wug

+0

當你說你看到「不同」的輸出時,你看到不同的輸出都是有效的嗎?如果是這樣,那就沒有什麼可調查的了。但是,如果您看到輸出無效,則需要進行調查。首先嚐試推理如何創建特定的無效輸出。根據需要添加調試語句。 –

+0

編輯.......... – mahmood

回答

0

我並不完全確定發生了什麼,因爲你沒有給出一個完整的可編譯程序來進行試驗,但很明顯,每個線程正在從a的部分讀取/寫入它未被分配對它,所以你在各地都有競爭條件。你正在交換a的部分,所以我不確定你可以按照現在的情況並行化這個算法。