假设我有一个缓冲区,其中有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/