在后台运行线程,并继续使用OpenMP主线程

时间:2018-10-17 09:52:23

标签: 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  
    {
      #pragma omp section
      { increment1(); }
    }
  }
  printf("Continue\n" );

  return 0;
}

如您所见,increment1()需要太多时间才能完成。我的问题是如何在后台设置此任务,并在printf("Continue\n" );完成后先打印printf("%d\n",x );消息,然后打印increment1()。 也尝试过OpenMP run threads but continue main,但不起作用

2 个答案:

答案 0 :(得分:0)

OpenMP无法像这样工作。通常,您使用OpenMP使increment1中的循环运行得更快,例如通过应用#pragma omp parallel for。当然,具体的工作共享方法取决于您的 actual 函数的作用。

如果您确实需要使用功能并行性,即同时运行不同的功能,请所有应该同时运行的功能(因此包括执行printf的代码)必须在section s(或task s)内。

答案 1 :(得分:0)

您可以使用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指令在那里,因此任务只能由一个线程创建。否则,每个线程都会为increment1printf语句创建任务。