为什么插入printf语句会使我的函数正常工作?

Xer*_*aqu 2 c printf openmp

这是我的代码的基本前提:

while(norm_of_error > tol){
  #pragma omp parallel for
  for(i = 1; i <= N*N; i++){
    //printf("thread id: %d\n",omp_get_thread_num());
      :
    int val = based on i
      :
    #pragma omp critical
    x[i-1] = val;
  }
  #pragma omp barrier
  iter++;
}
Run Code Online (Sandbox Code Playgroud)

简而言之,我使用Jacobi迭代方法求解Ax = b.我的问题是,在printf()语句取消注释的情况下,norm_of_error趋向于零并且while循环结束.但是,通过简单地说出printf()声明,这不会发生.任何人都可以给我一个暗示,为什么printf()声明有任何影响?我猜这个问题与omp_get_thread_num()的调用有关,但我不明白为什么会有任何区别.

编辑:我将printf()语句更改为printf("hi\n");,代码工作.注释出来,代码不起作用.

Pet*_*ter 5

printf()语句一起使用但在删除时失败的代码通常是某些无效操作的标志,这些操作会影响某个程序中的内存(例如,从数组的末尾掉下来,解除引用NULL等).行为不当的代码可能完全在程序的其他部分(例如,不在包含该printf()语句的函数内)

当违规printf()陈述显然是无辜的,并且没有任何可能影响其他代码行为的副作用(例如printf("Hi\n"))时,这更有可能发生.

原因是额外的存在printf()实际上影响了整个程序的内存布局.因此,违规代码(可能在程序中某些完全不相关的部分)仍会覆盖内存,但后果会发生变化(例如,覆盖某些数据,允许程序更改,而不是导致操作系统终止的某些内存区域)该程序).

无论代码是否为多线程,都是如此.

如果没有完整的代码来说明问题(即其他人可以编译,构建和运行以获得相同症状的小样本),则不可能更具体.