【发布时间】:2014-03-04 06:28:25
【问题描述】:
假设我有一个缓冲区,其中包含 3 个生产者线程和 5 个消费者线程,它们向/从缓冲区插入和消费。
我只想允许 1 个生产者或最多 3 个消费者线程在任何给定时间访问缓冲区。
只有在没有生产者访问它的情况下,最多 3 个消费者可以查看缓冲区中的顶部元素。如果超过 1 个消费者线程确实访问了缓冲区,则最后离开的线程必须删除顶部元素。
现在这是类分配的部分,并且分配明确声明使用信号量。但是,我想不出一种仅使用信号量来真正实现这种措辞的方法。
伪代码 - 我认为 - 应该是这样的:(我不担心缓冲区是空的还是满的,只是这个问题的子部分)
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)
}
}
我认为这是逻辑的要点,问题是如何仅使用信号量来实现这一点。如何只允许 1 个带有信号量的生产者进入,但在另一侧允许 3 个消费者进入?看来我需要使用信号量以外的东西。
另外,如果需要,请更正任何逻辑,这只是一个大概的想法。
【问题讨论】:
-
SO 不是代码审查或意见的网站。您有具体的技术问题吗?
-
您希望所有消费者都获得数据的副本吗??
-
@Jens Gustedt:所以基本上你希望我删除这篇文章,然后发布我的真实代码并说,“我如何让三个消费者只使用信号量?”当这是我要问的问题的简化版本时,这似乎很愚蠢。 const:所有消费者?只有在任何给定时间进来的 3 个,但是是的,他们都应该得到一份副本。
-
通过一些信号量的实现,可以在一次操作中获取多个permit。例如,参见 Java 中的 Semaphore。您的 信号量 也可以做到这一点吗?
-
@nosid:我正在使用 pthreads...我应该这样规定。据我所知,没有。但是,我只是在很短的时间内阅读了它们。这里似乎需要某种类型的信号。基本上我认为问题源于:有没有办法只在 pthreads 中发出信号量未锁定的信号?
标签: c multithreading pthreads producer-consumer