Я нашел этот код при обмене стеками обзора кода, который реализует проблема производитель-потребитель. Я публикую здесь фрагмент кода.
В данном коде давайте рассмотрим сценарий, когда производитель производит значение, вызывая void add(int num)
, он получает блокировку мьютекса mu
и buffer.size()==size_
, это заставляет производителя перейти в очередь ожидания из-за условной переменной cond
.
В тот же момент происходит переключение контекста, и потребитель вызывает функцию int remove()
для потребления значения, он пытается получить блокировку мьютекса mu
, однако блокировка уже была ранее получена производителем, поэтому он терпит неудачу и никогда не потребляет значение, следовательно вызывая тупик.
Где я здесь ошибаюсь? Поскольку код, кажется, работает правильно, когда я его запускаю, отладка мне не помогла.
Спасибо
void add(int num) {
while (true) {
std::unique_lock<std::mutex> locker(mu);
cond.wait(locker, [this](){return buffer_.size() < size_;});
buffer_.push_back(num);
locker.unlock();
cond.notify_all();
return;
}
}
int remove() {
while (true)
{
std::unique_lock<std::mutex> locker(mu);
cond.wait(locker, [this](){return buffer_.size() > 0;});
int back = buffer_.back();
buffer_.pop_back();
locker.unlock();
cond.notify_all();
return back;
}
}