假设我有一个缓冲区,其中有3个生产者线程和5个消费者线程插入和消费缓冲区。
我只想允许1个生产者或最多3个消费者线程在任何给定时间访问缓冲区。
最多有3个消费者可以查看缓冲区中的顶部元素,前提是没有生产者访问它。如果超过一个使用者线程访问缓冲区,则最后一个要离开的线程必须删除顶部元素。
现在这是类赋值的一部分,赋值显式地声明使用信号量。但是,我想不出一种方法来真正实现这种措辞,只使用信号量。
伪代码应该是这样的:(我不担心缓冲区是空的还是满的,只是这个问题的一部分)

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)

    }
}

我认为这就是逻辑的要点,问题是如何只用信号量来实现这一点。如何只允许一个生产者使用一个信号量,而允许另一方使用三个消费者?好像我需要用信号量以外的东西。
另外,如果需要,请更正任何逻辑,这只是一个一般性的想法。

最佳答案

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

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);
}

关于c - 具有pthread信号量和多个线程的C生产者/消费者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22164552/

10-13 05:08