返回空结构而不是NULL的奇怪问题

时间:2014-10-31 05:18:25

标签: c multithreading producer-consumer

上下文

我正在研究消费者和生产者多线程程序。该程序有一个共享变量num_elem,它在生产者中递增并在消费者中递减。

num elem正在为使用结构queue的循环缓冲区提供信息,以便queue存储从文件中读取的单词数组。

如果增量从生产者内部变为生产者调用的函数,则生成者和消费者之间的通信是固定的。 Else ,如果生产者的代码作为函数调用(作为消费者),used布尔值在实际上未被使用时更改为TRUE。 /强>

每个代码都在下面。

问题

如果在生产者之外调用增量,则used的值将更改为true。 为什么在生成器内部调用它们时会被更改,而不是在生成器内部调用它时的函数?

生产者代码

item_t *item = NULL;
for (i = 0; i < QUEUE_SIZE; i++) {
    if (queue[(next_index + i) % QUEUE_SIZE].used == false) {
        item = &queue[(next_index + i) % QUEUE_SIZE];
        item->used = true;
        num_elem++;
        next_index = (i + 1) % QUEUE_SIZE;
    }
}

消费者代码

item_t *consume_item() {
    for (i = 0; i < QUEUE_SIZE; i++) {
        if (queue[i].used == true) {
            item_t *item = &queue[i];
            item->used = false;
            num_elem--;
            return item;
        }
    }
    return NULL;

Here is the github repo, if you would like to see the whole code

1 个答案:

答案 0 :(得分:1)

在错误版本中,您需要在第150行之后添加break;