3个消费者2个生产者。对一个缓冲区进行读写操作。生产者A将1个元素推送到buffer (长度N),而生产者B正在将2个元素推送到buffer。无活动等待。我不能使用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。
我可以用什么方法来解决这个问题?
发布于 2016-12-05 05:55:10
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;
}
}我希望这将在未来对某些人有用。
https://stackoverflow.com/questions/40950357
复制相似问题