Завершение потоков при многопоточной обработке файла

Есть Json файл большого размера(1,5гб+). Для его обработки использую QJson в нескольких потоках

Есть:

void handleJsonAcync(std::queue<QString>&,bool& status);//вызов потоков
void handleJson(std::queue<QString>&,bool&,int id);//обработчик строк
std::vector<std::thread> threadPool;
std::mutex mutex;

Вызовов потоков происходит максимально просто:

//status передается из цикла чтения файла и меняется когда файл прочитан и Que пуста (обработаны все строки)    
void handleJsonAcync(std::queue<QString>&Que,bool &stats)
    {
        threadPool.push_back(std::thread(handleJson,std::ref(Que),std::ref(stats),1));
        threadPool.back().detach();
        threadPool.push_back(std::thread(handleJson,std::ref(Que),std::ref(stats),2));
        threadPool.back().detach();
    }

Обработчик строк содержит мьютекс чтобы потоки по одному брали строку из очереди

void handleJson(std::queue<QString>&Que,bool &stats, int id)
{
    QJsonArray obj;
    while(true)
    {
        mutex.lock();
        //пытаемся взять строку из очереди   
        tryPutJson:
        if(!stats) break;
        else if(!Que.empty())
        {
            obj = QJsonDocument::fromJson(Que.front().toUtf8()).array();
            Que.pop();
        }
        else goto tryPutJson;

        mutex.unlock();
        //если взяли строку то обрабатываем
        if(!obj.isEmpty())
        {
            countsys++;
        }
    }
    std::cout<<"Thread: "<<id<< " out!";
}

По завершению ожидается что оба потока напишут "Thread out", но пишет только один, либо 1 либо 2, отсюда возникают сомнения в корректной работе, хотелось бы узнать почему только один поток выходит из цикла и какие мьютексы правильнее здесь использовать? Так как думаю дело в них


Ответы (1 шт):

Автор решения: muhamed

выход из цикла по if(!stats) break; оставляет mutex залоченным. Используйте lock_guard

→ Ссылка