Я делаю некоторые эксперименты по многопоточности на C++, и я понятия не имею, как решить одну проблему. Допустим, у нас есть пул потоков, который обрабатывает запросы пользователей с использованием существующего потока и создает новый поток, когда нет свободного потока. Я создал класс thread_ safe класса, который имеет методы push и pop. поп ждет, пока очередь пуста и возвращается только тогда, когда команда доступна или время ожидания. Теперь пришло время реализовать пул потоков. Идея состоит в том, чтобы освободить потоки сна в течение некоторого времени и убить нить, если после этого нечего делать. Вот реализацияСинхронизация потоков с boost :: condition_variable
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);
Насколько я вижу, нет никакого способа, чтобы проверить это.
Спасибо за ваши ответы.
Вы знаете, что код написания с небольшими комментариями, как правило, намного яснее, чем английский, с окроплением кода. Выполните полный код в одном блоке. –