C 如何使用OpenMp动态设置线程数

C 如何使用OpenMp动态设置线程数,c,signals,openmp,C,Signals,Openmp,我正在尝试使用OpenMp控制正在运行的线程。我需要的是根据特定条件设置运行线程的数量。我正在使用信号处理程序来控制线程。我编写了以下代码: #include<stdio.h> #include<signal.h> #include<unistd.h> #include<omp.h> int i; int num_threads = 4; void sig_handler(int signo) { if (signo == SIGUSR1)

我正在尝试使用OpenMp控制正在运行的线程。我需要的是根据特定条件设置运行线程的数量。我正在使用信号处理程序来控制线程。我编写了以下代码:

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

int i;
int num_threads = 4;

void sig_handler(int signo) {
  if (signo == SIGUSR1) {
    printf("\n receivd signal\n");
    omp_set_num_threads(2);
  } else if (signo == SIGKILL)
    printf("received SIGKILL\n");
  else if (signo == SIGSTOP)
    printf("received SIGSTOP\n");
}

int main(void) {
  i = 0;

  if (signal(SIGUSR1, sig_handler) == SIG_ERR)
    printf("\ncan't catch SIGUSR1\n");

  if (signal(SIGKILL, sig_handler) == SIG_ERR)
    printf("\ncan't catch SIGKILL\n");

  if (signal(SIGSTOP, sig_handler) == SIG_ERR)
    printf("\ncan't catch SIGSTOP\n");

  omp_set_num_threads(num_threads);

  #pragma omp parallel 
  while(1) {
    i++;
    printf("OPENMP USING SIGHANDLER::%d\n",i);
    sleep(1);
  }
  return 0;
}
#包括
#包括
#包括
#包括
int i;
int num_线程=4;
无效信号处理器(int signo){
if(signo==SIGUSR1){
printf(“\n接收信号\n”);
omp_设置_数量_线程(2);
}else if(signo==SIGKILL)
printf(“收到的SIGKILL\n”);
else if(signo==SIGSTOP)
printf(“接收到的信号停止\n”);
}
内部主(空){
i=0;
if(信号(SIGUSR1,sig_处理程序)=sig_错误)
printf(“\n无法捕捉信号1\n”);
if(信号(SIGKILL,sig_处理程序)=sig_ERR)
printf(“\n无法捕获SIGKILL\n”);
if(信号(SIGSTOP,sig_处理程序)=sig_ERR)
printf(“\n无法捕获SIGSTOP\n”);
omp_设置_num_线程(num_线程);
#pragma-omp并行
而(1){
i++;
printf(“使用SIGHANDLER的OPENMP::%d\n”,i);
睡眠(1);
}
返回0;
}

在这里,我使用
gcc filename.c-o file-fopenmp
编译了代码。因为我最初设置了4个线程,所以我可以看到4个线程正在运行。然后在运行期间,我使用
kill-USR1进程id
发出一个信号。在这里,我的程序收到了信号,之后我必须将线程数从4更改为2。但这次我得到了初始4个线程。我无法更改或控制
omp\u parallel
构造中的线程。请提出解决方案。

您这样做是错误的,线程数不能在并行部分内重新定义。您需要退出并行区域,更改线程数,然后使用某种类型的嵌套循环设置重新进入并行区域。为什么要更改并行区域中的线程数?您可以控制并行区域中的哪些线程工作,其余线程空闲,因此我认为只要有足够的线程开始,您就不需要减少线程数量。我必须在我的一个项目中使用这样的场景。为此,我正在编写一个类似上述的示例应用程序。是否有其他方法来控制这些线程平行线内region@JonnyHenly,我怎样才能从并行部分退出呢?你的意思是退出整个进程并重新启动它吗?我必须在不中断当前进程的情况下控制线程execution@Chinnu你在这方面还有问题吗?如果是这样的话,我可以用上面提到的场景的一个例子发布一个答案。