我想在C中实现单生产者多用户程序,并且在消费者中使用字符'\ 0'来查看它是否是文件的结尾。然而,当有多个消费者时以及当他们都在等待最后一个字符时,会发生死锁,但只有其中一个人进入了关键部分并使用此字符。这里是我的代码:生产者 - 消费者C编程中的死锁
void insert(char* buffer, char value){
printf("lock in insert %c\n", value);
sem_wait(&empty);
sem_wait(&mutex);
printf("insert %c\n",value);
buffer[in] = value;
in = (in+1) % BUFFER_SIZE;
sem_post(&mutex);
sem_post(&full);
}
char get(char* buffer) {
char item;
printf("lock in get\n");
sem_wait(&full);
sem_wait(&mutex);
item = buffer[out];
printf("comsume %c\n",item);
out = (out+1)%BUFFER_SIZE;
sem_post(&mutex);
sem_post(&empty);
return item;
}
void *produce(void *param) {
int i=0;
char randomChar;
for(i=0; i<NUM_OF_INTEGERS; ++i) {
randomChar = 'A' +random()%26;
insert(buffer, randomChar);
}
insert(buffer, '\0');
printf("produce finished\n");
}
void *consume(void *param) {
int i=0;
char data;
do{
data = get(buffer);
}while(data != '\0');
printf("consume finished\n");
}
生产者/消费者模型排队的并发访问。请阅读有关问题的定义。你只需要使用一个固定的缓冲区并行填充和读取,而不是作为一个排队系统。无论如何,你需要定义你如何停下来。 –
您的设计有根本性的缺陷。您需要为每个消费者提供单独的结束标记。每个人都不能只有一个结束标记,因为只有一个消费者可以读取它。 – Barmar
我知道我没有使用排队系统,但是我甚至将它改为队列而不是数组,死锁仍然存在,如何为每个人定义一个结束标记? – pousT