c++ - 为什么在 pragma omp critical 之后多次调用 printf 会产生乱码输出?

标签 c++ c openmp

我有两个生成多个线程并打印 hello <TID> world <TID> 的程序到标准输出。 第一个在一个函数中打印它:

#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 之后断言互斥直到并行 block 结束。但事实似乎并非如此。 是否#pragma omp critical仅适用于紧随其后的语句?

如果知道为什么会发生这种情况,那就太好了。 艾萨克

最佳答案

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

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

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

关于c++ - 为什么在 pragma omp critical 之后多次调用 printf 会产生乱码输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526002/

相关文章:

c - 关于解决并行化问题的一般问题

c++ - 将一个 char 和一个 int 组合成一个字符串

c++ - 对静态 constexpr char[] 的 undefined reference

c - 如何在 gradle 中的构建类型中为 native 代码定义宏?

c - 为什么在写入使用字符串文字初始化的 "char *s"而不是 "char s[]"时出现段错误?

multithreading - 您使用哪些并行编程 API?

c - Pthreads 与 OpenMP

c++ - 如何将 lambda 函数或 std::function 与采用函数指针的 API 结合使用?

c++ - 为什么 std::uninitialized_move 不存在?

c - 使用 objdump 或类似工具显示每个函数的调用约定