Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的pthread队列_C_Linux_Pthreads - Fatal编程技术网

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之前等待线程终止。悬挂指针确实解决了它,非常感谢!