gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:04 25 4
gpt4 key购买 nike

假设我有一个缓冲区,其中有 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 个消费者进入另一侧?看来我需要使用信号量以外的东西。

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

最佳答案

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

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 - C中的生产者/消费者,带有pthread信号量和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22164552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com