假设我有一个缓冲区,它有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个消费者?似乎我需要使用除信号量之外的东西。
此外,如果需要,请更正任何逻辑,这只是一个大致的想法。
答案 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);
}