2016-11-24 95 views
2

我想在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");  
} 
+0

生产者/消费者模型排队的并发访问。请阅读有关问题的定义。你只需要使用一个固定的缓冲区并行填充和读取,而不是作为一个排队系统。无论如何,你需要定义你如何停下来。 –

+0

您的设计有根本​​性的缺陷。您需要为每个消费者提供单独的结束标记。每个人都不能只有一个结束标记,因为只有一个消费者可以读取它。 – Barmar

+0

我知道我没有使用排队系统,但是我甚至将它改为队列而不是数组,死锁仍然存在,如何为每个人定义一个结束标记? – pousT

回答

0

正如其他人所说,你需要发送一个以上终止(即)一个为每个消费者。

produce,更改:

insert(buffer, '\0'); 

分为:可发生

for (i=0; i<NUM_OF_CONSUMER; ++i) 
    insert(buffer, '\0'); 
0

分段故障。

buffer大小为10字节,实际存储的是20字节。

变化buffer大小为20

#define BUFFER_SIZE 20 
+0

谢谢,我只注意到我应该使用out =(out + 1)%BUFFER_SIZE而不是out =(out + 1)%NUM_OF_INTEGER来确定缓冲区中的位置 – pousT