我有两个生成多个线程并打印 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/