C 在后台运行线程并使用OpenMP继续main

C 在后台运行线程并使用OpenMP继续main,c,multithreading,openmp,C,Multithreading,Openmp,这是我想要的一个例子 #include <stdio.h> #include <omp.h> void increment1(){ int x; x=0; for(int i = 0; i<30000000000000;i++){ ++x; } printf("%d\n",x ); } int main(){ #pragma omp parallel { #pragma omp sections {

这是我想要的一个例子

#include <stdio.h>
#include <omp.h>

void increment1(){
  int x;
  x=0;
  for(int i = 0; i<30000000000000;i++){
    ++x;
  }
  printf("%d\n",x );
}

int main(){
  #pragma omp parallel  
  {
    #pragma omp sections  
    {
      #pragma omp section
      { increment1(); }
    }
  }
  printf("Continue\n" );

  return 0;
}
#包括
#包括
无效增量1(){
int x;
x=0;

for(int i=0;iOpenMP不是这样工作的。通常,您使用OpenMP使
递增1
中的循环运行得更快,例如,通过应用
\pragma omp parallel for
。当然,具体的工作共享方法取决于实际函数的功能

如果您确实需要使用功能并行性,即同时运行不同的功能,则应同时运行的所有功能(因此包括执行
printf
的代码)都需要位于
部分(或
任务
中)。

您可以使用omp任务:

int main() {
#pragma omp parallel
  {
#pragma omp single
    {
#pragma omp task
      increment1(300000000);
#pragma omp task // if you leave out this pragma the printf will be executed 
                 // by the same thread that created the increment1 task
                 // otherwise it can be scheduled by any OMP thread
      printf("continue\n");

#pragma omp taskwait
    }
  }
  return 0;
}
此示例将创建两个任务(一个用于
increment1
函数,另一个用于
printf(“continue\n”)
),它们将分布在OMP线程之间。任务可以按任意顺序调度,但当OMP线程多于任务时,它们将同时调度


附加说明:
#pragma omp single
指令存在,因此任务仅由一个线程创建。否则,每个线程将为
递增1
printf
语句创建一个任务。

请注意,“它不工作”从来都不是一个足够的问题描述。“如您所见”不,我们应该在哪里看到这一点?一个聪明的编译器可能会对函数进行相当多的优化,使其只需要很少的时间。无限数不存在。您使用的值将不适合
int
,因此您最终会溢出它。从那里发生的是未定义的行为,任何事情都可能发生,包括程序崩溃或程序错误ram似乎工作正常。在修复此错误之前,对您的程序所做的操作的推测是无用的。作为补充说明,如果您甚至不知道标准整数类型的限制,则不应接近OpenMP或多线程。从学习C的基础知识开始。忘记增量示例。假设函数increment1()时间太长了,我们对此无能为力。