c中的pthread队列

时间:2012-08-25 15:21:41

标签: c linux pthreads

我是使用线程的新手,我认为一个好的练习就是编写一个与线程一起工作的队列。但是,出了点问题,我怀疑消费者线程试图访问相同的数据或其他东西。我使用互斥体,但我可能误解了一些东西......

我收到此错误(大约每三次运行):

*** glibc detected *** ./t_queue_test: double free or corruption (fasttop): 0x0000000002114610 ***

代码相当长,所以我把它发布在pastebin上,但如果那不正确,我可以将它粘贴到这里。

t_queue.h - > http://pastebin.com/2KYmujeE

t_queue.c - > http://pastebin.com/1wZPMwDB

t_queue_test.c - > http://pastebin.com/QKCTQWaf

我认为错误发生在函数'get_q'中,我在代码中标记了它。

感谢您的任何指示或建议。我为了类似的问题挖掘了stackoverflow,我会挖掘更多! Valgrind也没有显示任何内容。

1 个答案:

答案 0 :(得分:1)

稍后请注意,如果pastebin消失了;错误的代码就是这个;

if(q->rear != NULL && q->front != NULL)
{
    node_n = q->front;
    *d = node_n->data;
    q->front = node_n->next;
    free(node_n);           
}

它可以很好地清理前面,但是如果删除了最后一个元素,则还需要更新后部以反映队列为空。例如,这样做;

if(q->rear != NULL && q->front != NULL)
{
    node_n = q->front;
    *d = node_n->data;
    q->front = node_n->next;
    if(q->front == NULL) 
      q->rear = NULL;
    free(node_n);
}