Параллельность потоков c++
У меня есть std::queue и, допустим, 4 std::thread. Я хочу, чтоб каждый поток брал себе из очереди задачу (назову элемент так) и далее производил с ним действия, которые приведут к добавлению в эту же очередь новых задач. Проблема вот в чём: изначально у меня в очереди лежит одна единственная задача, а потока 4. Также есть проверка на непустую очередь, чтобы в конце потоки завершились. Происходит такая ситуация, потоки все дружно проходят проверку на непустую очередь, далее лок. Первый поток берёт единственную задачу из очереди и удаляет её оттуда, после этого анлок и выполнение задачи. Второй поток уже пытается работать с пустой очередью (есть проверка что очередь всё-таки опустела после предыдущего). И вот на этом моменте я хочу, чтоб поток подождал, когда в очереди появятся новые задачи (их туда добавит первый поток). Возможно ли это как-то реализовать? Убедительная просьба не писать комментарии или ответы из категории "фигню придумал, делай по-другому", я на данном этапе хочу попробовать реализовать свою идею, спасибо. Если на словах не очень понятно, то вот код:
void A::worker() {
while (!_queue.empty()) {//очередь - поле класса А с одной записью внутри (изначально)
cs.lock();
if (_queue.empty()) {
continue;
}
auto a = _queue.front().str;
auto b = _queue.front().depth;
_queue.pop();
cs.unlock();
maker(a, b);//внутри есть добавление задач в очередь, push() залочен
}
}
//инициализация потоков
void А::threaders() {
for (unsigned i = 1; i <= _threads_count; ++i){
_threads.emplace_back(std::thread(&А::worker, this));
}
for (auto& i : _threads){
i.join();
}
}