3 消费者 2 生产者。读取和写入一个缓冲区。 生产者 A 将 1 个元素推送到缓冲区(长度 N),生产者 B 将 2 个元素推送到缓冲区。没有主动等待。我不能使用 System V 信号量。
生产者 A 的示例代码:
void producerA(){
while(1){
sem_wait(full);
sem_wait(mutex);
Data * newData = (Data*) malloc(sizeof(Data));
newData->val = generateRandomletter();
newData->A = false;
newData->B = false;
newData->C = false;
*((Data*) mem+tail) = *newData;
++elements;
tail = (tail + 1) % N;
sem_post(mutex);
sem_post(empty);
}
}
除了阅读或消费之外,消费者看起来很相似,但这无关紧要。 我和制作人 B 有很多麻烦。显然我不能做像
这样的事情sem_wait(full); sem_wait(full);
我还尝试为生产者 B 使用不同的信号量,当缓冲区中有 2 个或更多空闲点时,该信号量将被提升。但这并没有奏效,因为我仍然需要适本地降低和增加信号量 full
和 empty
。
我可以通过哪些方式解决这个问题?
最佳答案
https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 那将是我遇到的整个问题的解决方案。
长篇大论:
我可以提供的最简单的同步是使用信号量 full
和 empty
来表示我已推送到缓冲区的元素数。但是,如果我有一个创建 2 个元素的生产者,那么这种解决方案不适用于 POSIX 信号量。
我的解决方案是一个不同的概念。
流程的概要归结为:
while(1){
down(mutex);
size = get size
if (condition related to size based on what process this is)
{
do your job;
updateSize(int diff); // this can up() specific semaphores
// based on size
// each process has his own semaphore
up(mutex);
}
else
{
up(mutex);
down(process's own semaphore);
continue;
}
}
我希望这对将来的人有用。
关于c++ - Producer-Consumer 生产者创建 2 个元素 POSIX 信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950357/