繁体   English   中英

当我使用大量操作时,在C中使用双链表的队列被杀死-程序被杀死

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM