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

标签 c concurrency

我正在尝试用 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/

相关文章:

c - 为什么无法在 for 循环中使用 fgets 以正确的方式获取 char[][] 的值

从其他线程调用 FD_SET,select 仍然阻塞

c# - 支持移除项的线程安全集合

java - 在启动时控制竞争条件

c# - 并发访问 .NET 中的静态成员

java - 对象构造后读取字段陈旧值

c++ - 从 float 到 double 和从 double 到 float 的精度损失?

c - 读取命令行参数时出现段错误

c - openSSL key block 访问功能?

sql-server - 具有许多并发、长时间运行的查询的 SQL Server 性能