我正在尝试用 C 语言实现一个单生产者多消费者程序,我在消费者中使用字符 '\0' 来查看它是否是文件的末尾。但是,当有多个消费者并且他们都在等待最后一个字符但只有一个进入临界区并消费这个字符时,就会发生死锁。这是我的代码:
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");
}
最佳答案
正如其他人所提到的,您需要为每个消费者发送一个以上的终止符(即)。
在produce
中,改变:
insert(buffer, '\0');
进入:
for (i=0; i<NUM_OF_CONSUMER; ++i)
insert(buffer, '\0');
关于c - 生产者消费者C编程中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40777642/