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");
...
}
主循環(其遍歷i
在foo()
)由線程數劃分。假設所有變量都被正確定義,因爲正如我所說的,1和2線程沒有問題。
它可能有助於嘗試StackOverflow調試器:只需將與該問題直接相關的代碼段添加到您的問題中,其他人就會查看它。 – Wug
當你說你看到「不同」的輸出時,你看到不同的輸出都是有效的嗎?如果是這樣,那就沒有什麼可調查的了。但是,如果您看到輸出無效,則需要進行調查。首先嚐試推理如何創建特定的無效輸出。根據需要添加調試語句。 –
編輯.......... – mahmood