我正在尝试用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");
}
答案 0 :(得分:0)
正如其他人所提到的,你需要为每个消费者发送一个以上的终结者(即)。
在obtain
中,更改:
produce
分为:
insert(buffer, '\0');
答案 1 :(得分:0)
可能发生分段错误。
buffer
大小为10个字节,实际上您存储的是20个字节。
将buffer
尺寸更改为20
#define BUFFER_SIZE 20