Я провожу несколько экспериментов с многопоточностью в C ++ и не знаю, как решить одну проблему.Допустим, у нас есть пул потоков, который обрабатывает запросы пользователей, используя существующий поток, и создает новый поток, когда нет свободных потоков.Я создал потокобезопасный класс command_queue, в котором есть методы push и pop.pop ожидает, пока очередь пуста, и возвращает, только когда команда доступна или истекло время ожидания.Теперь пришло время реализовать пул потоков.Идея состоит в том, чтобы свободные потоки спали в течение некоторого времени и убивали поток, если после этого периода времени нечего делать.Вот реализация
command_queue::handler_t handler;
while (handler = tasks.pop(timeout))
{
handler();
}
, здесь мы завершаем процедуру потока, если истекло время ожидания.Это нормально, но есть проблема с созданием нового потока.Допустим, у нас уже есть 2 потока, обрабатывающих пользовательские запросы, они работают в данный момент, но нам нужно выполнить некоторую другую операцию асинхронно.Мы вызываем
thread_pool::start(some_operation);
, который должен начинать новый поток, потому что свободных потоков нет.Когда поток доступен, он вызывает timed_wait
для условной переменной, поэтому идея состоит в том, чтобы проверить, есть ли ожидающие потоки.
if (thread_are_free_threads) // ???
condition.notify_one();
else
create_thread(thread_proc);
, но как это проверить?Документация говорит, что если нет ожидающих потоков, notify_one ничего не делает.Если бы я мог проверить, действительно ли он ничего не сделал, это было бы решением
if (!condition.notify_one()) // nobody was notified
create_thread(thread_proc);
Насколько я вижу, это невозможно проверить.
Спасибо за ваши ответы.