Stavo discutendo con un compagno di squadra sul blocco in .NET. È un ragazzo davvero brillante con una vasta esperienza sia nella programmazione di livello inferiore che di livello superiore, ma la sua esperienza con la programmazione di livello inferiore supera di gran lunga la mia. Ad ogni modo, ha sostenuto che il blocco di .NET dovrebbe essere evitato su sistemi critici che dovrebbero essere sottoposti a carichi pesanti, per quanto possibile, al fine di evitare la piccola possibilità di un "thread zombi" che si schianta contro un sistema. Uso abitualmente il blocco e non sapevo cosa fosse un "filo zombi", quindi ho chiesto. L'impressione che ho avuto dalla sua spiegazione è che un thread di zombi è un thread che è terminato ma che in qualche modo mantiene ancora alcune risorse. Un esempio di come un thread di zombi potrebbe rompere un sistema è stato un thread che inizia una procedura dopo aver bloccato un oggetto, e poi viene a un certo punto terminato prima che il blocco possa essere rilasciato. Questa situazione ha il potenziale per arrestare il sistema in modo anomalo, perché alla fine, i tentativi di eseguire quel metodo comporteranno tutti i thread in attesa dell'accesso a un oggetto che non verrà mai restituito, perché il thread che utilizza l'oggetto bloccato è morto.
Penso di averne capito il senso, ma se sono fuori base, per favore fatemelo sapere. Il concetto aveva senso per me. Non ero del tutto convinto che questo fosse uno scenario reale che poteva accadere in .NET. Non ho mai sentito parlare di "zombi", ma riconosco che i programmatori che hanno lavorato in modo approfondito ai livelli più bassi tendono ad avere una comprensione più profonda dei fondamenti dell'informatica (come il threading). Sicuramente vedo il valore del blocco, tuttavia, e ho visto molti programmatori di livello mondiale sfruttare il blocco. Ho anche una capacità limitata di valutarlo da solo perché so che l' lock(obj)
affermazione è davvero solo zucchero sintattico per:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
e perché Monitor.Enter
e Monitor.Exit
sono contrassegnati extern
. Sembra ipotizzabile che .NET esegua un qualche tipo di elaborazione che protegge i thread dall'esposizione a componenti di sistema che potrebbero avere questo tipo di impatto, ma che è puramente speculativo e probabilmente basato solo sul fatto che non ho mai sentito parlare di "thread zombi" prima. Quindi, spero di poter ottenere un feedback su questo qui:
- Esiste una definizione più chiara di "filo zombi" rispetto a quella che ho spiegato qui?
- I thread di zombi possono verificarsi su .NET? (Perché perché no?)
- Se applicabile, come potrei forzare la creazione di un thread zombi in .NET?
- Se applicabile, come posso sfruttare il blocco senza rischiare uno scenario di thread zombi in .NET?
Aggiornare
Ho fatto questa domanda poco più di due anni fa. Oggi è successo:
wait
o waitpid
. Il processo figlio viene quindi chiamato "processo zombi". Vedi anche howtogeek.com/119815