Domanda

Questo articolo offre una buona panoramica di perché la gestione strutturata delle eccezioni è negativa. C'è un modo per ottenere la solidità di arrestare il crash del server, mentre si superano i problemi menzionati nell'articolo?

Ho un software server che esegue contemporaneamente circa 400 utenti connessi. Ma se si verifica un arresto, vengono interessati tutti e 400 gli utenti. Abbiamo aggiunto la gestione delle eccezioni strutturata e apprezzato i risultati per un po ', ma alla fine abbiamo dovuto rimuoverlo a causa di alcuni arresti che causavano il blocco dell'intero server (il che è peggio del solo arresto anomalo e riavvio stesso).

Quindi abbiamo questo:

  • Con SEH: solo 1 utente dei 400 ha un problema per la maggior parte degli arresti anomali
  • Senza SEH: se un utente subisce un arresto anomalo, tutti e 400 sono interessati.
  • Ma a volte con SEH: il server si blocca, tutti e 400 sono interessati e gli utenti futuri che tentano di connettersi.
È stato utile?

Soluzione

Suddividi il tuo programma in processi di lavoro e in un processo a server singolo. Il processo del server gestirà le richieste iniziali e quindi le distribuirà sui processi di lavoro. Se un processo di lavoro si arresta in modo anomalo, sono interessati solo gli utenti di quel lavoratore. Non utilizzare SEH per la gestione generale delle eccezioni: come hai scoperto, può e ti lascerà completamente aperto ai deadlock e puoi comunque andare in crash comunque.

Altri suggerimenti

Usare SEH perché il tuo programma si arresta in modo casuale è una cattiva idea. Non è polvere magica di folletti che puoi cospargere sul tuo programma per farlo smettere di schiantarsi. Rintracciare e correggere i bug che causano gli arresti anomali è la soluzione giusta.

L'uso di SEH quando hai davvero bisogno di gestire un'eccezione strutturata va bene. Larry Osterman ha pubblicato un post di follow-up che spiega quali situazioni richiedono SEH: file mappati in memoria, RPC e transizioni dei limiti di sicurezza .

Correggi i bug nel tuo programma? ;)

Personalmente, terrei i gestori SEH dentro, li farei scaricare uno stack di chiamate in cui la violazione di accesso o qualunque cosa accadesse e risolverei i problemi. Il problema "a volte il server si blocca" è probabilmente dovuto ai deadlock causati dal thread che aveva l'eccezione SEH mantenendo qualcosa bloccato e quindi è improbabile che sia correlato al fatto che stai utilizzando SEH stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top