c中的pthread队列
我不熟悉使用线程,我认为一个好的练习是编写一个与线程一起工作的队列。但是,有些地方出了问题,我怀疑使用者线程试图访问相同的数据或其他内容。我使用互斥体,但我可能误解了 我发现这个错误(大约每运行三次):c中的pthread队列,c,linux,pthreads,C,Linux,Pthreads,我不熟悉使用线程,我认为一个好的练习是编写一个与线程一起工作的队列。但是,有些地方出了问题,我怀疑使用者线程试图访问相同的数据或其他内容。我使用互斥体,但我可能误解了 我发现这个错误(大约每运行三次): ***glibc检测到***./t\u队列\u测试:双重释放或损坏(fasttop):0x0000000002114610*** 代码相当长,所以我已经将其发布在pastebin上,但如果这是错误的,我可以将其粘贴到这里 t_queue.h-> t_queue.c-> t_queue_test.
***glibc检测到***./t\u队列\u测试:双重释放或损坏(fasttop):0x0000000002114610***
代码相当长,所以我已经将其发布在pastebin上,但如果这是错误的,我可以将其粘贴到这里
t_queue.h->
t_queue.c->
t_queue_test.c->
我认为错误发生在函数“get_q”中,我已经在代码中标记了它
谢谢你的指点和建议。我已经围绕stackoverflow挖掘了类似的问题,我还会挖掘更多!Valgrind也没有显示任何内容。只是一个备忘,以防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);
}
首先,当您“获取”最后一个元素时,您似乎会将
rear
作为悬空指针离开。请注意,只要存在任何访问队列的线程,您也无法安全地删除整个队列。del_q锁定互斥锁的事实在任何情况下都没有帮助,在访问队列的所有其他线程终止之前,您无法调用del_q操作。我在del_w中加入了pthread_,这应该是在调用del_q之前等待线程终止。悬挂指针确实解决了它,非常感谢!