2012-03-23 15 views
6

asincrona segnale Secondo APUE 2e Capitolo 12.5:Differenza tra thread-safe e sicuro

Se una funzione è rientrante rispetto alla più thread, diciamo che è thread-safe. Questo non ci dice, tuttavia, se la funzione è rientrante rispetto ai gestori di segnale. Diciamo che una funzione che è sicura di essere reintrodotta da un gestore di segnale asincrono è sicura per i segnali asincroni.

Le mie domande sono

Q1:

Esiste un "rientrante generale" concetto (che significa ri-entrantcy in tutte le circostanze)? In caso affermativo, il rientro generale è uguale al rientro rispetto al segnale multi-thread e asincrono? O c'è anche una terza condizione da prendere in considerazione quando si parla di rientro generale?

Q2:

sicurezza Discussione non implica la sicurezza async-signal, che è evidente. Ma la sicurezza del segnale asincrono implica sicuramente la sicurezza del filo? Ho cercato spesso su Google, le persone stanno dicendo che lo fa, ma non riesco a trovare alcuna fonte per questo.

Q3:

Se le risposte sia per Q1 e Q2 sono sì, immagino generale rientrante solo equivale a async-segnale a sicurezza?

risposta

5

Q1: la sicurezza del segnale asincrono è il concetto più forte di rientranza. Richiede un uso molto attento delle risorse ed è difficile da gestire nel codice dell'applicazione multipiattaforma.

Q2: la sicurezza del segnale asincrono implica la sicurezza del thread. Thread safe significa che è OK provare a chiamare la funzione due volte, ma da thread diversi; la sicurezza del segnale asincrono è più forte perché due invocazioni della funzione possono essere nella stessa discussione. Questo rende le cose molto più difficili, perché non puoi semplicemente aspettare che l'altra invocazione della funzione rilasci i suoi blocchi, la seconda chiamata all'interno del gestore di segnale deve essere in grado di interrompere la prima anche se le risorse condivise si trovano in uno stato incoerente , quindi ripristina le cose quando esce. È praticamente impossibile utilizzare lo stato/le risorse condivise da un gestore di segnali: usa sempre il "trucco dell'autodifesa" a meno che tu non sappia davvero come funzionano i gestori di segnale e hai qualche motivo oscuro per scrivere codice pazzo.

Q3: alcune persone possono utilizzare il rientro per indicare solo thread safe. I gestori di segnale Unix sono l'unico luogo comune in cui è necessario qualcosa di più forte, ed è un po 'oscuro perché non dovresti cercare di fare qualcosa di intelligente lì.

+0

Ho trovato questo esempio: https://en.wikipedia.org/wiki/Reentrancy_(computing) Fare riferimento alla seconda funzione di scambio nel wiki, è sicuro per il segnale asincrono, ma non è thread-safe. Quindi penso che la sicurezza del segnale asincrono NON implichi thread safe. – PickBoy

+0

Buon punto, questo è un controesempio! Però artificioso. –