Добрый вечер, господа.
Есть следующая проблема: нужен thread pool (на современных плюсах написанный), от которого требуются всего две вещи:
1. Возможность асинхронно в него пихать задачи
2. После акта запихивания нужна возможность синхронно дождаться окончания выполнения всех задач. Немного погуглив, я нашел вот это: https://github.com/vit-vit/CTPL Но с этой либой есть две проблемы, маленькая и большая:
1. Меньшая в том, что насколько я понял, она не умеет из коробки принимать метод (а я хочу ту же семантику, что при передаче метода в конструктор std::thread). Но это я могу, наверное, исправить, подумав какое-то время, а пока просто метод в лямбду оборачиваю и пихаю ей.
2. А вот главная проблема в том, что эта либа реализует ожидание выполнения, вызывая на всех тредах .join(). И мне это очень не нравится, потому что итераций «запихнул - подождал» у меня планируется много, и они довольно короткие, и я не хочу каждый раз платить за создание новых тредов.
Поэтому, собственно, вопрос: как сделать так, чтобы когда переданный пулу метод вернет результат, рабочий тред не заканчивал работу, а засыпал на условной переменной, пока не появятся новые задачи? (Очевидный способ - чтобы он какой-нибудь atomic<bool> записывал в конце, но я хочу именно его засыпания на condition variable'е, а не polling loop в мастер-треде).
Если я дурак, а такая хрень по какой-либо причине не нужна, дайте знать, пожалуйста:)
Спасибо.