2012-01-15 15 views
10

Eventuali duplicati:
Malloc thread-safe?malloc() non è rientranti ma thread-safe?

Io non sono un po 'confuso, mentre io sto leggendo "L'interfaccia di programmazione di Linux".

Dal libro si dice che malloc è non rientranti poiché manipola la struttura di dati dell'elenco globale collegato ma è reso thread-safe utilizzando mutex.

Sono un po 'confuso su questo: dato che è thread-safe con l'uso del mutex e quindi può essere invocato da più di un thread allo stesso tempo, perché non è una funzione di rientro? (se diciamo che reentrant significa che può essere invocato da più di un chiamante allo stesso tempo)

Un'altra domanda è che, dal momento che malloc è thread-safe, possiamo inserirlo in un gestore di segnale? Penso che la risposta sia sì, ma non sono sicuro poiché, secondo questo libro, si dice che solo una funzione di rientro o segnale asincrono può essere inserita nel gestore del segnale.

Qualcuno può spiegarmi questo?

+0

Il mutex è incluso nell'implementazione di malloc? – Bingo

risposta

23

se diciamo che da rientro significa che può essere invocato da più di un chiamante allo stesso tempo

sbagliato. Reentrant significa è possibile interromperlo e richiamarlo prima che l'incarnazione precedente terminasse. Immaginate malloc assomiglia a questo:

lock(mutex); 

/* Stuff. */ 

unlock(mutex): 

Che cosa succede se si è interrotto a metà, prima di sbloccare e qualcun altro chiama malloc?

  • Il primo contesto non può continuare fino a quando il secondo è fatto
  • Il secondo blocchi di contesto sul mutex e non può continuare fino alla prima sblocca il mutex

Questo è una situazione di stallo.

Un'altra domanda è che, dal momento che malloc è thread-safe, possiamo metterlo in un gestore di segnale? Penso che la risposta sia sì

Sbagliato di nuovo. Vedi l'esempio sopra. Immagina che il programma principale stia facendo un malloc e prima che la funzione in realtà finisca il tuo gestore chiama malloc.

+0

Grazie cnicutar, la risposta è MOLTO CHIARA !! – kai

+0

@kai: Si noti che il problema (confondere questi concetti) è esacerbato dal fatto che le versioni precedenti di POSIX (pre-2008) usavano erroneamente il termine reentrant per indicare thread-safe ... –

2

Reentrancy e thread-safety sono due concetti diversi. Una funzione di rientro può essere non sicura dal thread e una funzione thread-safe può essere non rientranti.

Le funzioni di libreria in C non sono garantite come rientranti e solo le funzioni di rientro possono essere richiamate dai gestori di segnale.

+0

'Una funzione di rientro può essere non- thread-safe' ... Può? –

+4

@iuliux: Sì. Su alcune macchine, le variabili statiche sono più veloci delle variabili locali basate su stack. Il codice che in entrata copia le sue variabili statiche nello stack, usa le variabili statiche e quindi ripristina le variabili dallo stack che saranno rientranti ma non thread-safe. – supercat