Domanda

Ho un problema di sicurezza rispetto alle eccezioni sulla funzione InitOnceExecuteOnce WinAPI. Ogni volta che viene generata un'eccezione da funzione di callback stallo è verificato. Richiamata torna flag booleano dice il chiamante se i dati viene inizializzato con successo, ma se dovessi tornare falso che non sarà in grado di rigenerare eccezione, che non va bene. Ho provato risolto il problema in questo modo.

try
{
    InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
    InitOnceInitialize(&flag);
    throw;
}

Ogni volta che prendo una deroga funzione I init la struttura, ancora una volta e rigenerare l'eccezione, così altri thread troverò i dati non inizializzata, come la bandiera è in stato iniziale. Tuttavia, a volte troppo deadlock, probabilmente perché altro thread iniziato attesa sull'oggetto sincronizzazione prima del primo catturato l'eccezione e bandiera inizializzato nuovamente. C'è qualche soluzione a questo problema?

Grazie in anticipo.

È stato utile?

Soluzione

Non si dovrebbe generare eccezioni C ++ tramite il codice che non si aspetta che, (ad es. Codice C, o nel tuo caso, l'API di Windows). invece, avere il vostro falso ritorno richiamata in caso di errore, che si rifletterà nel ritorno da InitOnceExecuteOnce

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