我有两个程序会产生多个线程,并将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/