Повысить условные переменные - делать ли вызовы стека «notify_one»?
В приложении одного производителя / одного потребителя, использующего потоки Boost, что произойдет, если поток производителя сделает более одного вызоваcond_var.notify_one()
прежде чем потребительский поток вызвалcond_var.wait(lock)
?
Будут ли дополнительные звонкиnotify_one
быть сложены так, что каждый вызов.wait()
будет соответствовать 1: 1 с.notify_one()
вызов?
РЕДАКТИРОВАТЬ A часто цитируемый пример Для реализации параллельной очереди предусмотрены следующие методы:
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
void wait_and_pop(Data& popped_value)
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
popped_value=the_queue.front();
the_queue.pop();
}
Я использовал очень похожий код и испытал некоторый странный рост памяти, который, по-видимому, объясняется тем, что потребительский поток не просыпается для каждого.notify_one()
(потому что он все еще занят выполнением другой работы), и задавался вопросом, может ли быть причиной отсутствие «укладки».
Казалось бы, без суммирования этот код потерпит неудачу, если (иногда) поток потребителя не сможет идти в ногу с потоком производителя. Если моя теория верна, я был бы признателен за предложения о том, как исправить этот код.