Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生产者-消费者C编程中的死锁_C_Concurrency - Fatal编程技术网

生产者-消费者C编程中的死锁

生产者-消费者C编程中的死锁,c,concurrency,C,Concurrency,我正在尝试用C实现一个单生产者多消费者程序,我在消费者中使用字符“\0”来查看它是否是文件的结尾。然而,当有多个使用者,并且当他们都在等待最后一个字符,但其中只有一个进入了关键部分并使用该字符时,就会发生死锁。这是我的密码: void insert(char* buffer, char value){ printf("lock in insert %c\n", value); sem_wait(&empty); sem_wait(&mutex);

我正在尝试用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");    
}
void插入(字符*缓冲区,字符值){
printf(“锁定插入%c\n”,值);
sem_等待(&empty);
sem_等待(&mutex);
printf(“插入%c\n”,值);
缓冲区[in]=值;
in=(in+1)%BUFFER\u大小;
sem_post(和互斥);
sem_职位(完整);
}
字符获取(字符*缓冲区){
字符项;
printf(“锁定获取\n”);
sem_等待(&full);
sem_等待(&mutex);
项目=缓冲区[输出];
printf(“消费%c\n”,项目);
out=(out+1)%BUFFER\u大小;
sem_post(和互斥);
sem_post(&空);
退货项目;
}  
void*product(void*param){
int i=0;
随机字符;

对于其他人提到的(i=0;i),您需要为每个消费者发送多个终止符(即)

生产中
,更改:

insert(buffer, '\0');
进入:


(i=0;i分段故障可能发生

缓冲区
大小为10个字节,实际存储的是20个字节

将缓冲区大小更改为20

#define BUFFER_SIZE 20

生产者/消费者模型队列并发访问。请阅读有关问题的定义。您只是使用固定缓冲区同时填充和读取,而不是作为队列系统。无论如何,您需要定义如何停止。您的设计存在根本性缺陷。您需要为发送给每个消费者的消息设置一个单独的结束标记。您无法对于每个人来说,只有一个结束标记,因为只有一个消费者可以读取ITG。我明白我不是在使用排队系统,但事情是我把它改为队列而不是数组,死锁仍然存在,如何为每个人定义一个结束标记?考虑使用标准库中的原子类型,释放和消耗内存ORD。ring?为了避免并发,我建议使用一个信号量变量。基本上,您的关键代码部分是访问
buffer
的地方。尝试使用一个信号量变量实现。谢谢,我刚刚注意到我应该使用out=(out+1)%buffer\u SIZE而不是out=(out+1)%NUM\u of\u INTEGER来确定缓冲区中的位置
#define BUFFER_SIZE 20