【发布时间】:2019-05-18 22:59:59
【问题描述】:
一个生产者和一个消费者的生产者消费者队列的代码From wikipedia是:
semaphore fillCount = 0; // items produced
semaphore emptyCount = BUFFER_SIZE; // remaining space
procedure producer()
{
while (true)
{
item = produceItem();
down(emptyCount);
putItemIntoBuffer(item);
up(fillCount);
}
}
procedure consumer()
{
while (true)
{
down(fillCount);
item = removeItemFromBuffer();
up(emptyCount);
consumeItem(item);
}
}
上面写着
当只有一个生产者并且 消费者。
当生产者/消费者较多时,伪代码相同,用互斥锁保护putItemIntoBuffer(item); 和removeItemFromBuffer(); 部分:
mutex buffer_mutex; // similar to "semaphore buffer_mutex = 1", but different (see notes below)
semaphore fillCount = 0;
semaphore emptyCount = BUFFER_SIZE;
procedure producer()
{
while (true)
{
item = produceItem();
down(emptyCount);
down(buffer_mutex);
putItemIntoBuffer(item);
up(buffer_mutex);
up(fillCount);
}
}
procedure consumer()
{
while (true)
{
down(fillCount);
down(buffer_mutex);
item = removeItemFromBuffer();
up(buffer_mutex);
up(emptyCount);
consumeItem(item);
}
}
我的问题是,为什么在单生产者单消费者情况下不需要互斥锁?
考虑以下几点:
- 队列中有 5 个项目,允许 10 个项目。
- 生产者产生一个项目,减少空信号量(并成功),然后开始将项目放入缓冲区,但未完成
- 消费者减少填充信号量,然后开始从缓冲区中删除项目
- 出乎意料。尝试从缓冲区 (3) 中删除项目,同时将项目放入缓冲区 (2)
为什么我描述的没有发生?
【问题讨论】:
标签: parallel-processing synchronization mutex semaphore producer-consumer