生产者消费者问题 c 消费者没有产出

问题描述

在这里,我试图为我的插入和删除方法使用一个循环的 queish 东西,以及使用插入和删除函数进行同步 我用 gcc file.c -lpthread -lrt 编译并用 ./a.out 50 1 1 运行。

在运行我的生产者后正确生产和输出

producer thread #0
consumer thread #0
producer produced 7

但无论出于何种原因,我都无法让我的消费者输出

我试过把我的回报设为 0;对于锁和信号量之外的每个函数,它确实输出消费者,但是太多次了,每个线程只应该运行一次,

它也使用标准的计数信号量 2 以及单个互斥锁

当我将返回移动到锁下方时会发生这种情况

producer thread #0
consumer thread #0
producer produced 7
consumer consumed 7
producer produced 5
producer produced 5
consumer consumed 5
consumer consumed 2
producer produced 7
producer produced 4
consumer consumed 7
consumer consumed 4
producer produced 6
consumer consumed 6
producer produced 1
consumer consumed 1
producer produced 9
consumer consumed 9
producer produced 2
consumer consumed 2
producer produced 6
consumer consumed 6

实际上,如果我运行 ./a.out 50 1 1 应该只有一个生产者和一个消费者

更新:正在为此开发一个新版本,因此收回我以前的代码,将发布新版本

解决方法

在函数 insert_item()remove_item() 中,返回(函数的执行结束)发生在执行 pthread_mutex_unlock() 之前。这将阻止它们解锁并阻止函数的第二次或以后执行。

代替此,您应该将要返回的值存储在变量中,并在解锁后返回该值。可以这样做:

int insert_item(buffer_item item)
{
    int ret;
    sem_wait(&empty);
    pthread_mutex_lock(&lock);
 
    if (size_check < BUFFER_SIZE)
    {
        buffer[insertBounds_check++] = item;
        size_check++;
        ret = 0;
    }
    else
    {
        ret = -1;
    }
    pthread_mutex_unlock(&lock);
    sem_post(&full);
    return ret;
}