Multithreading 当只有一个生产者和一个消费者时,为什么不需要同步缓冲区?

Multithreading 当只有一个生产者和一个消费者时,为什么不需要同步缓冲区?,multithreading,operating-system,semaphore,race-condition,producer-consumer,Multithreading,Operating System,Semaphore,Race Condition,Producer Consumer,下面的伪代码来自 我的问题是,为什么我们可以在不同步的情况下同时调用putItemIntoBuffer和removeItemFromBuffer?为什么这里没有竞争条件?为什么我们可以在不同步的情况下同时调用putItemIntoBuffer和removeItemFromBuffer? 简单的回答是:这是一个伪代码,所以不要从字面上理解它。代码的目的是展示如何同步消费者和生产者,而不是数据访问,正如Wiki文章开头所述: 问题是确保生产者不会在缓冲区已满时尝试将数据添加到缓冲区中,消费者也不会尝

下面的伪代码来自

我的问题是,为什么我们可以在不同步的情况下同时调用
putItemIntoBuffer
removeItemFromBuffer
?为什么这里没有竞争条件?

为什么我们可以在不同步的情况下同时调用putItemIntoBuffer和removeItemFromBuffer? 简单的回答是:这是一个伪代码,所以不要从字面上理解它。代码的目的是展示如何同步消费者和生产者,而不是数据访问,正如Wiki文章开头所述:

问题是确保生产者不会在缓冲区已满时尝试将数据添加到缓冲区中,消费者也不会尝试从空缓冲区中删除数据

您所指的伪代码使用信号量解决此问题:

信号量解决了唤醒呼叫丢失的问题

如果缓冲区大小为1,则代码可能工作正常,没有任何额外的麻烦。但是,对于任何缓冲区大小,putItemIntoBuffer()/removeItemFromBuffer()的实际实现可能在内部使用锁来访问共享缓冲区,或者可以实现为无锁循环队列,就像本文中显示的producer()/consumer()函数之一,即:

volatile unsigned int produceCount = 0, consumeCount = 0;
ItemType buffer[BUFFER_SIZE];

void putItemIntoBuffer(ItemType *item) {
    buffer[produceCount % BUFFER_SIZE] = *item;
    ++produceCount;
}
void removeItemFromBuffer(ItemType *item) {
    *item = buffer[consumeCount % BUFFER_SIZE];
    ++consumeCount;
}
为什么这里没有比赛条件? 访问共享缓冲区可能存在竞争条件,但这不是生产者-消费者问题的要点,因此也不是上述Wiki文章的要点。

为什么我们可以在不同步的情况下同时调用putItemIntoBuffer和removeItemFromBuffer? 简单的回答是:这是一个伪代码,所以不要从字面上理解它。代码的目的是展示如何同步消费者和生产者,而不是数据访问,正如Wiki文章开头所述:

问题是确保生产者不会在缓冲区已满时尝试将数据添加到缓冲区中,消费者也不会尝试从空缓冲区中删除数据

您所指的伪代码使用信号量解决此问题:

信号量解决了唤醒呼叫丢失的问题

如果缓冲区大小为1,则代码可能工作正常,没有任何额外的麻烦。但是,对于任何缓冲区大小,putItemIntoBuffer()/removeItemFromBuffer()的实际实现可能在内部使用锁来访问共享缓冲区,或者可以实现为无锁循环队列,就像本文中显示的producer()/consumer()函数之一,即:

volatile unsigned int produceCount = 0, consumeCount = 0;
ItemType buffer[BUFFER_SIZE];

void putItemIntoBuffer(ItemType *item) {
    buffer[produceCount % BUFFER_SIZE] = *item;
    ++produceCount;
}
void removeItemFromBuffer(ItemType *item) {
    *item = buffer[consumeCount % BUFFER_SIZE];
    ++consumeCount;
}
为什么这里没有比赛条件?
访问共享缓冲区可能存在竞争条件,但这不是生产者-消费者问题的要点,因此也不是上述Wiki文章的要点。

为什么您认为不存在竞争条件?只有一个生产者和一个消费者的正确操作取决于putItemIntoBuffer和removeItemFromBuffer的实现。它可能是安全的,也可能不是。如果有多个生产者/消费者,你肯定需要对队列进行锁定。为什么你认为没有竞争条件?只有一个生产者和一个消费者的正确操作取决于putItemIntoBuffer和removeItemFromBuffer的实现。它可能是安全的,也可能不是。对于多个生产者/消费者,您肯定需要对队列进行锁定。