我正在研究消费者和生产者多线程程序。该程序有一个共享变量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
答案 0 :(得分:1)
在错误版本中,您需要在第150行之后添加break;
。