Немного не по теме, но актуально imo (... ждет пламени в комментариях).
Модель потребителя здесь очень жадная, она постоянно проверяет наличие данных в очереди. Это будет более эффективно (тратит меньше циклов ЦП), если ваши потребительские потоки будут детерминированно пробуждены при наличии данных, используя межпотоковую сигнализацию, а не этот цикл блокировки и просмотра. Подумайте об этом следующим образом: хотя очередь пуста, это по сути замкнутый цикл, нарушенный только необходимостью получения блокировки. Не идеально?
void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;
queue.pop_front();
}
}
}
Я понимаю, что вы изучаете, но я бы не советовал использовать это в «реальном» коде. Для изучения библиотеки все же хорошо. К вашему сведению, это более сложный пример, чем необходимо, чтобы понять, как использовать lock_guard, поэтому вы стремитесь к высокой цели!
В конце концов, вы, скорее всего, создадите (или, лучше, если возможно, повторно) код для очереди, который сигнализирует работникам, когда они должны выполнять работу, и затем вы будете использовать lock_guard
внутри своих рабочих потоков, чтобы обеспечить доступ к общему данные.