C中的生产者/消费者,具有pthread信号量和多线程

时间:2014-03-04 06:28:26

标签: c multithreading pthreads producer-consumer

假设我有一个缓冲区,它有3个生产者线程和5个消费者线程插入和消耗缓冲区。

我只想允许1个生产者或最多3个消费者线程在任何给定时间访问缓冲区。

如果没有生产者访问缓冲区,最多只有3个消费者可以查看缓冲区中的top元素。如果超过1个使用者线程确实访问缓冲区,则要离开的最后一个线程必须删除顶部元素。

现在这是类赋值的 part ,并且赋值明确指出使用信号量。但是,我无法想到一种方法,只使用信号量才能真正实现这一措辞。

伪代码 - 我认为 - 应该是这样的:(我不担心空的或完整的缓冲区,只是这个问题的子部分)

sem_init(&binary, 0, 1);  //Init binary semaphore to 1
sem_init(&consumerCount, 0 , 3);  //Allows 3 consumers to access

producer()
{
    createItem()
    sem_wait(&binary)
    appendItem()
    sem_post(&binary)
}

//The above assures nothing else can access buffer while appending an item

consumer()
{

    while( binary unlocked)
    {
        sem_wait(&binary) and sem_wait(&consumerCount)  //Locks the producers out
                                                        //Allows 3 consumers in 
        peek()  //Gets copy of top item
        if( last consumer out )
        {
            delete()  //Deletes top item
            sem_post(&binary)  //Allow producer access back since last one out
        }
        sem_post(&consumerCount)         

    }
}

我认为这是逻辑的要点,问题是如何用信号量来实现它。我如何只允许一个生产者使用信号量,但另一方允许3个消费者?似乎我需要使用除信号量之外的东西。

此外,如果需要,请更正任何逻辑,这只是一个大致的想法。

1 个答案:

答案 0 :(得分:2)

您可以使用两个信号量解决问题。第一个信号量用于生产者的独占访问。第二个信号量用于共享访问。生产者试图获得所有三个许可证以锁定消费者。

sem_init(&exclusive, 0, 1);
sem_init(&shared, 0, 3);

void producer()
{
    sem_wait(&exclusive);
    sem_wait(&shared);
    sem_wait(&shared);
    sem_wait(&shared);
    // critical section
    sem_post(&shared);
    sem_post(&shared);
    sem_post(&shared);
    sem_post(&exclusive);
}

void consumer()
{
    sem_wait(&shared);
    // critical section
    sem_post(&shared);
}