c - c中的pthread队列

标签 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 也没有显示任何内容。

最佳答案

只是一个注释,以防 pastebin 消失;错误的代码是这样的;

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

它可以很好地清理 front,但是如果最后一个元素被删除,则 rear 也需要更新以反射(reflect)队列为空。比如这个就可以了;

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);
} 

关于c - c中的pthread队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123210/

相关文章:

c - 将数组中的数字打印到 * 例如。 1 进 * 和 5 进 ***** C 编程

linux - 如果没有订阅者,udp 多播是否会在网络上放置任何内容?

Linux 用户空间 ELF 加载器在 fork 后出现极其奇怪的行为

c - 为什么需要在 C 中初始化 pthread 互斥锁?

c - 我是 C 的新手,scanf 有一些问题,我的变量等于 0

c - 将正 double 型强制转换为 unsigned int 实现是已定义的还是可移植的?

c - nptl SIGCONT 和线程调度

多次调用创建线程的方法

c - Intel Xeon Phi 上的快速人口统计

c++ - 使用 boost 的 C++ 中的 hello world python 扩展?