I termini thread e processi costituiscono concetti correlati in ambito informatico. Entrambi rappresentano infatti sequenze di istruzioni che devono essere eseguite in un ordine specifico. Le istruzioni incluse in thread o processi distinti possono tuttavia essere eseguite in parallelo.
I processi sono disponibili nel sistema operativo e corrispondono a ciò che gli utenti visualizzano sotto forma di programmi o applicazioni. I thread sono invece disponibili nei processi. Per questo motivo vengono talvolta definiti processi leggeri. Ciascun processo è costituito da uno o più thread.
La presenza di più processi consente a un computer di eseguire più attività contemporaneamente. La presenza di più thread consente invece a un processo di suddividere le operazioni da eseguire in parallelo. In un computer con più processori, i processi o i thread possono essere eseguiti in processori diversi consentendo l'effettiva elaborazione in parallelo.
Una perfetta elaborazione in parallelo non è sempre possibile. È talvolta necessario sincronizzare i thread. È inoltre possibile che un thread debba attendere un risultato di un altro thread o disporre di accesso esclusivo a una risorsa utilizzata da un altro thread. I problemi di sincronizzazione costituiscono una causa comune di bug in applicazioni con multithreading. È talvolta possibile che i thread rimangano in attesa di una risorsa che non diviene mai disponibile, causando una condizione denominata deadlock.
Nel debugger di Visual Studio sono disponibili strumenti efficaci e di facile utilizzo per il debug di thread e processi.
Strumenti per il debug di thread e processi in Visual Studio
I principali strumenti per la gestione dei processi in Visual Studio sono la finestra di dialogo Connetti a processo, la finestra Processi e la barra degli strumenti Posizione di debug. I principali strumenti per il debug dei thread sono la finestra Thread, i marcatori dei thread nelle finestre di origine e la barra degli strumenti Posizione di debug.
I principali strumenti per il debug delle applicazioni multithreading sono le finestre Stack in parallelo, Attività in parallelo, Espressione di controllo in parallelo e Thread GPU.
Nella tabella riportata di seguito sono illustrate le informazioni disponibili e le operazioni che è possibile eseguire con ciascuno strumento:
Interfaccia utente
Informazioni disponibili
Operazioni eseguibili
Finestra di dialogo Connetti a processo
Processi disponibili cui è possibile eseguire la connessione:
Nome di processo (estensione exe)
Numero di ID di processo
Titolo della barra dei menu
Tipo (Managed v4.0; Managed v2.0, v1.1, v1.0; x86; x64; IA64)
Nome utente (nome di account)
Numero di sessione
Selezione di un processo a cui connettersi
Selezione di un computer remoto
Modifica del tipo di trasporto per la connessione a computer remoti
Finestra Processi
Processi collegati:
Nome di processo
Numero di ID di processo
Percorso dell'eseguibile (file con estensione exe) di processo
Titolo della barra dei menu
Stato (Interrompi. In esecuzione)
Debug (nativo, gestito e così via)
Tipo di trasporto (predefinito, nativo senza autenticazione)
Qualificatore di trasporto (computer remoto)
Strumenti:
Connetti
Disconnetti
Termina
Menu di scelta rapida:
Connetti
Disconnetti
Disconnetti al termine del debug
Termina
Finestra Thread
Thread nel processo corrente:
ID thread
ID gestito
Categoria (thread principale, thread dell'interfaccia, gestore delle chiamate a una procedura remota o thread di lavoro)
Nome thread
Percorso in cui viene creato il thread
Priorità
Affinity Mask
Numero sospesi
Nome di processo
Indicatore flag
Indicatore di sospensione
Strumenti:
Cerca
Cerca nello stack di chiamate
Contrassegna Just My Code
Contrassegna selezione moduli personalizzata
Raggruppa per
Colonne
Espandi/Comprimi stack di chiamate
Espandi/comprimi gruppi
Blocca/sblocca thread
Menu di scelta rapida:
Mostra thread nell'origine
Passa al thread
Blocca un thread in esecuzione
Sblocca un thread bloccato
Imposta flag del thread per studio aggiuntivo
Rimuovi flag del thread
Rinomina thread
Mostra/Nascondi thread
Altre azioni:
Visualizzare lo stack di chiamate per un thread in un suggerimento dati
Finestra di origine
Gli indicatori dei thread all'estrema sinistra indicano thread singoli o più thread (disattivati per impostazione predefinita, si attivano tramite il menu di scelta rapida nella finestra Thread)
Menu di scelta rapida:
Passa al thread
Imposta flag del thread per studio aggiuntivo
Rimuovi flag del thread
Barra degli strumenti Posizione di debug
Processo corrente
Mostra l'anteprima dell'applicazione
Sospendi l'applicazione
Riprendi l'applicazione
Sospendi e arresta l'applicazione
Thread corrente
Attiva/Disattiva lo stato di flag del thread corrente
Mostrare solo thread con flag
Mostra solo processo corrente
Stack frame corrente
Passare a un altro processo
Sospendi, riprendi o arresta l'applicazione
Passare a un altro thread del processo corrente
Passare a un altro stack frame del thread corrente
Contrassegnare o rimuovere i contrassegni dei thread correnti
Mostrare solo thread con flag
Mostra solo processo corrente
Finestra Stack in parallelo
Stack di chiamate per più thread in una finestra.
Stack frame Attivo per ogni thread.
Chiamanti e chiamati per ogni metodo.
Filtraggio di thread specificati
Passaggio alla visualizzazione Attività in parallelo
Contrassegno o rimozione del contrassegno di un thread
Zoom
Finestra Attività in parallelo
Visualizzare informazioni sugli oggetti Task inclusi ID attività, stato dell'attività (programmato, in esecuzione, in attesa, in deadlock) e il thread assegnato all'attività.
Percorso corrente nello stack di chiamate.
Delegato passato all'attività in fase di creazione
Passare all'attività corrente
Contrassegnare o rimuovere il contrassegno di un'attività
Bloccare o sbloccare un'attività
Finestra Espressione di controllo in parallelo
Colonna flag, nella quale è possibile contrassegnare un thread al quale si desidera prestare particolare attenzione.
Colonna frame, in cui una freccia indica il frame selezionato.
Colonna configurabile che consente di visualizzare il computer, il processo, la sezione, l'attività e il thread.
Contrassegno o rimozione del contrassegno di un thread
Visualizza solo thread con flag
Passa da un frame all'altro
Ordina una colonna
Raggruppa i thread
Blocca o sblocca i thread
esporta i dati nella finestra Espressioni di controllo in parallelo
Finestra Thread GPU
Colonna flag, nella quale è possibile contrassegnare un thread al quale si desidera prestare particolare attenzione.
Colonna del thread attivo, nella quale una freccia gialla indica un thread attivo. Una freccia indica un thread nel quale l'esecuzione si è interrotta nel debugger.
Colonna Conteggio thread, che visualizza il numero di thread nella stessa posizione.
Colonna Riga che visualizza la riga di codice in cui si trova ciascun gruppo di thread.
Colonna Indirizzo che visualizza l'indirizzo dell'istruzione in cui si trova ciascun gruppo di thread.
Colonna Posizione che indica la posizione nel codice dell'indirizzo.
Colonna Stato, che indica se il thread è attivo o bloccato.
Colonna Sezione, che indica l'indice della sezione per i thread nella riga.
Passa a un altro thread attivo
Visualizza una sezione e un thread specifici
Mostra o nasconde una colonna
Ordina per colonna
Raggruppa i thread
Blocca o sblocca i thread
Contrassegno o rimozione del contrassegno di un thread