2010-05-16 16 views
11

stavo leggendo questo: http://en.wikipedia.org/wiki/Thread_safetysicurezza Discussione con il mucchio-memoria allocata

è la seguente funzione thread-safe?

void foo(int y){ 
    int * x = new int[50]; 
    /*...do some stuff with the allocated memory...*/ 
    delete [] x; 
} 

Nell'articolo si dice che per essere thread-safe è possibile utilizzare solo le variabili dallo stack. Veramente? Perché? Le chiamate successive della funzione sopra non allocano la memoria altrove?

Modifica: Ah. Sembra che ho letto male questa parte dell'articolo:

Una subroutine è rientrante, e quindi thread-safe, se

  • le uniche variabili che utilizza sono dalla pila

(l'ho preso come valore

Una subroutine è rientrante, e quindi thread-safe, se e solo se

  • le uniche variabili che usa sono dalla pila

, che secondo le risposte qui sotto, non è il caso)

+9

Utilizzare 'delete []' per matrici non 'delete' –

+0

@Brian: Woops - grazie. Ho aggiunto la parte dell'array dopo che avevo già digitato la funzione, in modo da chiarire che stavo allocando la memoria in modo dinamico, ma ho dimenticato di aggiungere []. +1 :) – Cam

+1

È incredibile vedere l'uso diffuso di wikipedia come riferimento per i concetti di programmazione :) – ch0kee

risposta

10

Se si esegue la codifica in un ambiente che supporta il multi-threading, allora si può essere piuttosto sicuro new è sicuro.

Sebbene la memoria sia nell'heap, il puntatore ad esso è in pila. Solo il thread ha il puntatore a questa memoria, quindi non vi è alcun rischio di modifiche simultanee - nessun altro thread sa dove è la memoria per modificarlo.

Si otterrebbe un problema con la sicurezza del thread solo se si passasse questo puntatore a un altro thread che modificasse contemporaneamente questa memoria nello stesso momento del thread originale (o di un altro).

+0

Grazie. Scelta difficile tra la tua risposta e quella di Peter, ma il tuo suggerimento utile alla fine è stato rilevante, mentre la sua riguardava i vettori :) – Cam

0

new e delete può o potrebbe non essere sicuro. Probabilmente lo sono, ma questo dipende dall'implementazione. Vedi: C++ new operator thread safety in linux and gcc 4

Per essere thread-safe, una funzione deve utilizzare le variabili stack o sincronizzare l'accesso ad altre risorse con altri thread. Finché chiamate separate a nuovo allocano spazio diverso sull'heap quando viene chiamato da thread diversi, si dovrebbe andare bene.

2

Non è detto che si possano usare solo variabili di stack, si dice che l'uso di variabili heap "suggerisce la necessità di un attento esame per vedere se non è sicuro".

new esono normalmente implementati in modo thread-safe (non è sicuro che lo standard lo garantisca), quindi il codice sopra probabilmente andrà bene.

Inoltre solite raccomandazioni di usare std::vector invece di allocare manualmente un array, ma suppongo che hai fornito solo a titolo di esempio :)

+1

Ricordo di aver operato in un ambiente in cui non lo erano. Ora * quello * era peloso. – Joshua

+1

È una fortuna che tu possa ignorarli quindi :) –

Problemi correlati