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 barriern");
    return -1;
  }
  int t;
  for(t = 0; t < threads; ++t) {
    printf("In main: creating thread %ldn", t);
    if(pthread_create(&td[t], NULL, &foo, (void*)t)) {
      printf("Could not create thread %dn", 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=%dn", 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 barriern");
    exit(-1);
  }
  printf("after barriern");
  ...
}

主循环(在foo()中迭代i)除以线程数。 假设所有变量都正确定义,因为正如我所说,1 和 2 线程没有问题。

我不完全确定发生了什么,因为你还没有给出一个完整的可编译程序来试验,但很明显,每个线程都在读取/写入a没有分配给它,所以你到处都有竞争条件。您正在交换a的部分,因此我不确定您是否可以并行化此算法。

最新更新