non appena tornare la funzione che genera l'errore
In effetti, non si deve distruggere un oggetto thread accostabile. Se avete bisogno di attendere il completamento del thread più tardi, poi staccarlo:
std::thread thread(ClientLoop,clientSocket);
thread.detach();
// OK to destroy now
Se hai bisogno di unirsi in un secondo momento, quindi si dovrà archiviare da qualche parte che persiste al di là del ciclo, ad esempio
std::vector<std::thread> threads;
while (whatever){
clientSocket = accept(listenSocket, nullptr, nullptr);
threads.emplace_back(ClientLoop,clientSocket);
}
// later
for (std::thread & t : threads) {
t.join();
}
// OK to destroy now
threads.clear();
In questo modo funziona, ma mi chiedo se non ci sono perdite di memoria.
Sì, questo perde. Ogni new
crea un oggetto thread e si elimina il puntatore senza eliminarlo o assegnarlo a un puntatore intelligente di cui occuparsi. Come menzionato nei commenti, non solo perde memoria, ma anche handle di thread, che su alcuni sistemi sono una risorsa più scarsa; quindi dopo un po 'potresti scoprire che non puoi lanciare altri thread.
Scollegare una filettatura è il modo di lasciarlo in esecuzione in background senza perdite. Questo fa sì che il thread rilasci le sue risorse quando finisce.
fonte
2014-12-15 12:30:07
Che cosa è esattamente l'errore? Potrebbe essere uno stack overflow in quanto si tratta di un ciclo infinito che accetta semplicemente troppe connessioni? – Codor
getta R6010 - abort() è stato chiamato – Tomas
Nota che generare un nuovo thread è * costoso *. È abbastanza probabile che l'elaborazione dei dati in serie richiederà più tempo rispetto alla creazione del thread, quindi non farlo alla cieca sperando in un facile parallelismo. – Mehrdad