使用生产者和消费者,C 中的信号量

Working with Producer and Consumer, sempahore in C

我正在尝试制作生产者/消费者应用程序。问题是,我的生产者正在填充整个缓冲区,然后消费者正在删除整个缓冲区......消费者不应该在生产者对信号量发出 post 后立即从缓冲区中删除一个项目吗?

我的代码:

void* producerFunc(void* arg)
{
    while(n_insertions < N_PRODUCTS)
    {
        sem_wait(&sem_postAvaliable);
        sem_wait(&mutex);
        //Insert Item
        sem_post(&mutex);
        sem_post(&sem_posTaken);
    }
    pthread_exit(NULL);
}

void* consumerFunc(void* arg)
{
    while(n_consumed < N_PRODUCTS)
    {
        sem_wait(&sem_posTaken);
        sem_wait(&mutex);
        //Remove from bufer
        sem_post(&mutex);
        sem_post(&sem_postAvaliable);
    }
    pthread_exit(NULL);
}  

n_insertions是一个全局整数,统计插入缓冲区的项目数;

n_consumed 是一个全局整数,用于计算消费者从缓冲区中消费某项的次数。

在非常高的级别上,当您执行 sem_post(&sem_posTaken) 时,您是在告诉消费者 "Hey!, you can consume something",但在那之后,根据处理器调度程序,生产者可能会继续生产,直到信号量的计数器不允许他们,所以也许消费者在生产者插入东西后立即消费,或者可能在 3 次插入后消费,谁知道呢?当您尝试创建计数器为 0 的信号量的 sem_wait 时,线程被阻塞。

如果您想在插入和删除之间交替,请尝试将 sem_postAvaliable 初始化为 1,这样一开始您将只允许一次插入,因为其他线程将被阻塞等待a sem_post(&sem_postAvaliable),那么只有一个消费者可以消费你在缓冲区中插入的任何内容,依此类推,但请注意,在这种情况下,大小大于 1 的缓冲区将毫无意义。