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()时间太长了,我们对此无能为力。