вместо условия !fullConfig.empty() можно завести свой булевый флаг в фоновом треде, который будет означать отсутствие активных задач.
Воркер четко знает что задача завершена (он ее выполнял), но не может поручиться за отсутствие, ведь задачи посылаются главной. Парить атомарный счетчик (++ в главной, -- в воркере) - да, есть такой вариант, неплохой, позволяет работать чисто сигналами.
Второй вариант в духе "анти-велик", использование Qt инструментария
C++ (Qt)
void waitForDone( void )
{
emit SignalEmptyBlank(); // BlockingQueuedConnection
}
Слот пустой, но он получит упр-е после всех предыдущих сигналов, т.е. когда желанный "done" наступил.
Ну и легким движением руки это превращается в асинхронку. Не умаляя заслуг std/boost замечу что потребности в них здесь никакой