【发布时间】:2014-05-01 02:39:29
【问题描述】:
我正在制作一个生产者/消费者模型,其中生产者需要将 int 值加入队列,而消费者将它们出列。每当我尝试将 int 排入队列时,都会出现分段错误。
这里是相关的队列代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int item;
struct Node* next;
} Node;
typedef struct Queue {
Node* head;
Node* tail;
void (*enqueue) (struct Queue* queue, int value);
int (*dequeue) (struct Queue* queue);
int (*queueEmpty) (struct Queue* queue);
int size;
} Queue;
void enqueue (Queue* queue, int item){
Node* n = (Node*) malloc (sizeof(Node));
n->item = item;
n->next = NULL;
if (queue->head == NULL) { // no head
queue->head = n;
} else{
queue->tail->next = n;
}
queue->tail = n;
queue->size++;
}
Queue* newQueue(){
Queue* queue;
queue->size = 0;
queue->head = NULL;
queue->tail = NULL;
queue->enqueue = &enqueue;
queue->dequeue = &dequeue;
queue->queueEmpty = &queueEmpty;
return queue;
}
然后我将其作为prodcons.c 文件中的共享资源:
Queue* queue;
在main中初始化:
queue = newQueue();
生产者代码:
void* producer(void* arg) {
int x;
for (x = 0; x <= n; x++){
pthread_mutex_lock(&lock);
while(queueSize(queue) == maxsize){
pthread_cond_wait(&lock, &empty)
}
enqueue(queue, x);
pthread_mutex_unlock(&lock);
}
return(NULL);
}
【问题讨论】:
-
您没有为队列分配任何内存。
Queue* queue;应该是Queue* queue = malloc(sizeof(Queue)); -
另外,在 enqueue 中,虽然您检查队列是否有头,但您不会检查队列是否有尾。入队代码似乎用于空队列,但没有初始化该尾部,导致使用 queue->tail->next 时 queue->tail 为 NULL。
-
@Misha 他只在
head为非NULL 时这样做。当你第一次排队时,它会同时设置head和tail,所以这应该是安全的(除非dequeue导致这种情况发生变化)。 -
@Barmar 看起来你是对的。无论哪种方式,您的评论都确定了该错误。
-
我认为 Johnny Mopp 的评论发现了这个错误。
标签: c data-structures segmentation-fault queue producer-consumer