Cosa c'è di diverso tra join()
e detach()
in multi threading in C++? join()
uccide il thread?Cosa c'è di diverso tra join() e detach() per il multi-threading in C++?
risposta
A C++ thread
oggetto generalmente (ma non sempre) rappresenta un thread di esecuzione, che è un concetto operativo o piattaforma.
Quando viene chiamato il numero thread::join()
, il thread chiamante bloccherà fino al completamento del thread di esecuzione. Fondamentalmente, questo è un meccanismo che può essere usato per sapere quando un thread ha finito. Al ripristino di thread::join()
, il thread di esecuzione del sistema operativo è stato completato e l'oggetto C++ thread
può essere distrutto.
Viene chiamato il thread::detach()
, il thread di esecuzione è "scollegato" dall'oggetto thread
e non è più rappresentato da un oggetto thread
- sono due cose indipendenti. L'oggetto C++ thread
può essere distrutto e il thread di esecuzione del sistema operativo può continuare. Se il programma deve sapere quando il thread di esecuzione è stato completato, è necessario utilizzare altri meccanismi. join()
non può più essere chiamato su quell'oggetto thread
, poiché non è più associato a un thread di esecuzione.
È considerato un errore distruggere un oggetto C++ thread
mentre è ancora "unificabile". Cioè, al fine di distruggere un oggetto C++ thread
o join()
deve essere chiamato (e completato) o detach()
deve essere chiamato. Se un oggetto C++ thread
è ancora unificabile quando viene distrutto, verrà generata un'eccezione.
Alcuni altri modi in cui un oggetto C++ thread
non rappresentare un thread di esecuzione (ad esempio, può essere unjoinable.):
- Un default costruito
thread
oggetto non rappresenta un thread di esecuzione, così non è accostabile. - Un thread che è stato spostato da non rappresenterà più un thread di esecuzione, quindi non è univoco.
join()
non uccide il thread. In realtà attende che ritorni la funzione principale del thread. Quindi, se la vostra funzione principale filo appare così:
while (true) {
}
join()
sta per aspettare per sempre.
detatch()
non elimina il thread. In realtà dice a std::thread
che questo thread dovrebbe continuare a funzionare anche quando l'oggetto std::thread
viene distrutto. C++ controlla in std :: thread destructor che il thread è unito o disconnesso e termina il programma se questo controllo fallisce.
Quindi se si decommenta la prima riga nella funzione main
del seguente codice, si bloccherà. Se disattivi la seconda o la terza riga, funzionerà bene.
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}
- 1. Entity Framework: differenza tra Detach e AsNoTracking
- 2. Differenze tra detach(), nascondere() e rimuovere() - jQuery
- 3. Differenza tra programma multithreading e async in C#
- 4. Capire il multithreading C#
- 5. Cosa c'è di diverso tra asynctreenode e treenode?
- 6. C++ 11 std :: thread :: detach e accesso ai dati condivisi
- 7. C# multithreading Comportamento strano
- 8. ciò che è diverso tra il passaggio per valore e il passaggio per riferimento utilizzando C#
- 9. Errori di multithreading in C#
- 10. Perché lo strumento di ottimizzazione oracle considera join JOIN e WHERE in modo diverso?
- 11. Differenza tra JOIN e JOIN FETCH in Hibernate
- 12. Differenza tra JOIN e outer join in MySQL
- 13. Tutorial di debug multithreading per GDB e C
- 14. che cosa è diverso tra il formato .ipa e .app nell'utilizzo di iphone?
- 15. OpenCV C++ velocita 'multithreading
- 16. Il migliore approccio multithreading nell'obiettivo C?
- 17. Thread Detach/Joinable Methods
- 18. Utilizzando multithreading per il ciclo
- 19. E riguardo il multithreading in Android SQLite?
- 20. Cosa c'è di diverso tra MainActivity.this vs getApplicationContext()
- 21. Qual è la differenza tra l'uso di add(). AddToBackStack(), add(). Detach() e replace(). AddToBackStack() in FragmentTransaction?
- 22. C# Multithreading - Richiama senza controllo
- 23. variabili di multithreading volatile C++
- 24. C# Confronto tra stringhe con caso diverso
- 25. Cosa c'è di diverso tra tutte queste interfacce OpenCV Python?
- 26. multithreading in C in un mmorpg
- 27. Cosa succede con il multithreading in php 7
- 28. Multithreading e chiusure NET
- 29. Cosa c'è di diverso tra i file Dim() Come file String e Dim come String()?
- 30. Ciclo di accelerazione utilizzando il multithreading in C# (Domanda)