使用openmp的c并行程序无法正常工作

使用openmp的c并行程序无法正常工作,c,parallel-processing,openmp,C,Parallel Processing,Openmp,当我在代码块中运行此代码时,它会给出一个奇怪的输出 #include<omp.h> #include<stdio.h> int main (int argc, char* argv[]) { int id, var2=2, var3 =3; /* sequential code */ printf("I am a serial region. \n"); #pragma omp parallel private(var2) shared(var3) { i

当我在代码块中运行此代码时,它会给出一个奇怪的输出

#include<omp.h>
#include<stdio.h>
int main (int argc, char* argv[])
 {

int id, var2=2, var3 =3;

/* sequential code */
printf("I am a serial region. \n");

#pragma omp parallel private(var2) shared(var3)
{
    id = omp_get_thread_num();
    if(id == 0){
        var2 = 22;
    }
    printf ("hello from thread %d\n" , id);
    printf("var2 %d \n " , var2);
    printf("var3 %d \n " , var3);
}

/* sequential code */
printf("I am a serial region. \n");
}
#包括
#包括
int main(int argc,char*argv[])
{
int-id,var2=2,var3=3;
/*顺序码*/
printf(“我是一个串行区域。\n”);
#pragma omp并行专用(var2)共享(var3)
{
id=omp_get_thread_num();
如果(id==0){
var2=22;
}
printf(“来自线程%d\n的hello”,id);
printf(“var2%d\n”,var2);
printf(“var3%d\n”,var3);
}
/*顺序码*/
printf(“我是一个串行区域。\n”);
}
那么,为什么输出没有组织起来呢


我想你说的是乱七八糟的台词,而不是乱七八糟的东西。你不能指望以任何顺序并行打印。这就是并行工作的本质


如果您指的是线程1的hello和奇怪的
v0
,那么您可能要处理的是一个。默认情况下,工作区域之外的任何变量都是共享的。您没有显式地将id声明为private或shared,因此它会在线程之间自动共享。您可能正在线程之间同时访问和写入id的值。任何时候你有一个数据竞赛,行为是未定义的,所以你可以看到各种各样的奇怪的事情。要修复此问题,您需要将其指定为private,或者只在for循环中声明id。

请不要显示文本图像。将粘贴文本作为文本复制到问题中。如果您得到意外的输出,那么请尝试向我们展示您期望的输出。另外,请花一些时间刷新,以及。至于您的问题,除非您的线程之间有任何类型的同步,否则您实际上无法控制它们何时运行或以什么顺序运行。那么,为什么输出没有组织?那么,“有组织”是什么意思?我假设您的意思是线程的
printf
输出是分散的。也就是说,您没有得到好的、干净的输出,即(例如)线程1的所有输出,线程2的所有输出。。。当然,您不会这样做,因为线程是并行运行的,因此您没有顺序。要对结果排序,您需要某种类型的线程间同步方法。@CraigEsty我的意思是printf没有打印整行,哪行没有完全打印?如果您将显示的所有输出拼凑在一起,那么您应该看到它实际上就是您编写的所有输出。只是搞砸了。我们本可以帮你,但不可能从图像复制粘贴文本!这也是你不应该显示文本图像的原因之一。