【发布时间】:2017-04-19 13:15:21
【问题描述】:
我在终止 C 程序中的部分时遇到问题。在一个线程中捕获SIGINT 信号后,我想退出所有线程,但我真的不知道如何退出,因为这些循环中有无限循环。程序等待来自服务器或标准输入的输入。所以我使用了信号处理程序。
我真的不知道我这样做是否正确,我也不太了解 OpenMP 中的取消是如何工作的。我没有找到合适的教程或讲座。
我的任务是在捕捉到SIGINT 信号后,终止程序。但是当我在处理程序中使用exit() 时,它显然会留下未释放的内存。我很乐意为您提供任何建议,谢谢。
#pragma omp parallel num_threads(2)
{
#pragma omp sections
{
#pragma omp section
{
void intHandler(int dummy)
{
char * welcome1 = calloc(strlen(username)+14,sizeof(char));
strcat(welcome1,username);
strcat(welcome1," logged out\r\n");
if(send(client_socket,welcome1,strlen(welcome1),0) < 0)
{
callError("ERROR: cannot send socked");
}
free(welcome1);
#pragma omp cancel section
}
signal(SIGINT, intHandler);
int i = 0, j = 1;
while(1)
{
str = (char*)malloc(sizeof(char));
while((c = getc(stdin)) != '\n')
{
str = (char*)realloc(str, j * sizeof(char));
str[i] = c;
i++;
j++;
}
str = (char*)realloc(str, j * sizeof(char));
str[i] = '\0';
if(strlen(str)!=0)
{
bufferIn = message(username,str);
if(send(client_socket,bufferIn,strlen(bufferIn),0) < 0)
{
callError("ERROR: cannot send socked");
}
free(bufferIn);
}
free(str); i = 0; j = 1;
}
#pragma omp cancellation point section
}
#pragma omp section
{
void intHandler(int dummy)
{
char * welcome1 = calloc(strlen(username)+14,sizeof(char));
strcat(welcome1,username);
strcat(welcome1," logged out\r\n");
if(send(client_socket,welcome1,strlen(welcome1),0) < 0)
{
callError("ERROR: cannot send socked");
}
free(welcome1);
#pragma omp cancel section
}
signal(SIGINT, intHandler);
char buffer[4096];
ssize_t length;
int received = 0;
int data_cap = 4096;
while(1)
{
data = calloc(BUFFER_LEN,sizeof(char));
while ((length = read(client_socket, buffer, BUFFER_LEN-1)) > 0)
{
received += length;
buffer[length] = '\0';
if (received > data_cap)
{
data = realloc(data,sizeof(char) * data_cap * 2);
data_cap = data_cap * 2;
}
strcat(data, buffer);
if(!isEnough(data))
{
break;
}
}
printf("%s", data);
free(data); bzero(buffer,BUFFER_LEN); data_cap = 4096; received = 0; length = 0;
}
#pragma omp cancellation point section
}
}
}
【问题讨论】:
-
"但是当我在处理程序中使用 exit() 时,它显然会留下未释放的内存。"嗯,这根本没有意义。一旦进程退出,它的所有内存都会被操作系统释放。 (当然,除非这里有您没有提及的共享内存段)。
-
我知道,但是将内存泄漏处理留给操作系统是不好的做法,就我的目的而言,它真的很糟糕,因为我在非常有限的机器上运行这个程序
-
@kakra “将内存泄漏处理留给操作系统是不好的做法”。我不同意。当整个地址空间即将被拆除时,使用“空闲”将分配的存储返回堆是浪费您的精力和 CPU 时间。当操作系统取消映射页面时,堆是否在其空闲列表中具有数据对操作系统没有任何影响,因此您只是通过调用 free 来浪费 CPU 时间。
标签: c multithreading openmp