我正在尝试使用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;
}
这里我使用gcc filename.c -o file -fopenmp
编译了代码。由于我最初设置了4个线程,我可以看到4个线程在运行。然后在运行时我使用kill -USR1 process_id
发出一个信号。这是我的程序接收到信号,之后我必须将线程数从4改为2.但这次我得到了最初的4个线程。我无法改变或控制omp_parallel
内部的线程构造。请提出解决方案。