我有两个程序会产生多个线程,并将hello <TID> world <TID>打印到stdout。
第一个在一个函数中打印它:

#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
  {
    int ID = omp_get_thread_num();
#pragma omp critical
    printf("hello  %d world %d\n", ID, ID);
  }
  return 0;
}

二分之二:
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
  {
    int ID = omp_get_thread_num();
#pragma omp critical
    printf("hello  %d", ID);
    printf("world %d\n", ID);
  }
  return 0;
}

使用该程序,只需调用printf(),输出就不会出现乱码。
但是,在第二个程序中,两次调用printf(),输出出现乱码。
使用第二个程序,永远不会有乱码干扰字符串序列。绝不会是hhhhellloohello...之类的东西。但是,不同的输出字符串之间存在乱码;可能性的排列:
hello  27hello  62hello  52hello  50hello  10world 62...

举个例子。

我以为#pragma omp critical会在pragma之后声明互斥,直到并行化块结束。但这似乎并非如此。#pragma omp critical是否仅适用于紧随其后的语句?

为什么会发生这种情况的任何见解都是很好的。
伊扎克

最佳答案

#pragma omp parallel一样, #pragma omp critical 仅限于下一行,除非您也将其设为一个块。

如果不想交错输出,请使用另一组花括号:

#pragma omp critical
{
    printf("hello  %d", ID);
    printf("world %d\n", ID);
}

关于c++ - 为什么在一次编译指示进入关键时刻后多次调用printf会产生乱码的输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45526002/

10-11 19:10