[英]Queue using doubly linked list in c - program is killed when I am using large number of operations
我编写了以下代码,并在Ubuntu上运行它。 当大小最大为2048X2048时,它工作正常(我需要2的幂)。 但是,当大小为4096X4096时,程序将被杀死。 当大小为512X512时,没有内存泄漏,当我尝试通过更大尺寸的valgrind运行它时,程序也会被杀死。
为什么?
#define SIZE_X 2048
#define SIZE_Y 2048
unsigned long long int counter =0;
struct task{
int x,y,dx,dy;
};
typedef struct task* Task;
struct node{
Task data;
struct node* next, *prev;
};
typedef struct node* Node;
struct queue{
Node head, tail;
};
typedef struct queue* Queue;
Queue tasksQueue =NULL;
void enqueue(Task t){
assert(t!=NULL);
Node node = (Node)malloc(sizeof(struct node));
assert(node!=NULL);
node->data = t;
node->next = NULL;
node->prev = NULL;
if(tasksQueue==NULL){
tasksQueue =(Queue)malloc(sizeof(struct queue));
assert(tasksQueue!=NULL);
tasksQueue->head = node;
tasksQueue->tail = node;
return;
}
else if(tasksQueue->head == NULL && tasksQueue->tail == NULL){
tasksQueue->head = node;
tasksQueue->tail = node;
return;
}
assert(tasksQueue->head != NULL && tasksQueue->tail != NULL);
tasksQueue->tail->next = node;
node->prev =tasksQueue->tail;
tasksQueue->tail = node;
assert(tasksQueue->head!=NULL);
}
Task dequeue(){
if(tasksQueue==NULL){
return NULL;
}
else if(tasksQueue->head==NULL && tasksQueue->tail==NULL){
return NULL;
}
assert(tasksQueue->head!=NULL && tasksQueue->tail!=NULL);
Task tempT = tasksQueue->head->data;
assert( tempT !=NULL);
Node tempN = tasksQueue->head;
assert( tasksQueue->tail->next==NULL);
if(tasksQueue->head->next==NULL){
tasksQueue->head = NULL;
tasksQueue->tail = NULL;
}
else{
tasksQueue->head->next->prev =NULL;
tasksQueue->head = tasksQueue->head->next;
}
free(tempN);
tempN = NULL;
return tempT;
}
void executeTask(Task t){
assert(t!=NULL);
if(t->dx ==1 && t->dy ==1){
counter++;
free(t);
t=NULL;
}
else{
Task t1 = (Task)malloc(sizeof(struct task));
Task t2 = (Task)malloc(sizeof(struct task));
Task t3 = (Task)malloc(sizeof(struct task));
Task t4 = (Task)malloc(sizeof(struct task));
assert(t1!=NULL);
assert(t2!=NULL);
assert(t3!=NULL);
assert(t4!=NULL);
t1->x = t->x;
t1->y = t->y;
t1->dx = t->dx/2;
t1->dy = t->dy/2;
t2->x = t1->x + t1->dx;
t2->y = t1->y ;
t2->dx = t1->dx;
t2->dy = t1->dy;
t3->x = t1->x;
t3->y = t1->y + t1->dy;
t3->dx = t1->dx;
t3->dy = t1->dy;
t4->x = t1->x + t1->dx;
t4->y = t1->y + t1->dy;
t4->dx = t1->dx;
t4->dy = t1->dy;
free(t);
t=NULL;
enqueue(t1);
enqueue(t2);
enqueue(t3);
enqueue(t4);
}
}
int main(){
int i;
Task t0 = (Task)malloc(sizeof(struct task));
assert(t0!=NULL);
t0->x = 0;
t0->y = 0;
t0->dx = SIZE_X;
t0->dy = SIZE_Y;
enqueue(t0);
while(counter<SIZE_X*SIZE_Y){
if(counter%1000000==0 && counter!=0){
printf("counter is:%llu\n",counter);
printf("another 1000000 done\n");
}
Task t = dequeue();
if(t!=NULL){
executeTask(t);
}
}
}
通过ulimit -a检查内存限制。 检查rss /数据段/堆栈限制大小。 尝试将它们一一增加,然后检查程序是否正常运行。 更改/etc/security/limits.conf中的限制可能需要重新登录。 另外,在系统日志中显示可能会给您带来一些有趣的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.