2010-05-16 14 views
11

estaba leyendo esto: http://en.wikipedia.org/wiki/Thread_safetySeguridad de los hilos con el montón de memoria asignada

Es la función siguiente hilo de seguridad?

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

En el artículo dice que para que sea seguro para subprocesos solo puede usar variables de la pila. De Verdad? ¿Por qué? ¿Las llamadas subsecuentes de la función anterior no asignarían memoria a otra parte?

Editar: Ah. Parece que leí mal esta parte del artículo:

Una subrutina es reentrante, y por lo tanto seguro para subprocesos, si

  • las únicas variables que utiliza son de la pila

(Lo tomé en el sentido de

Una subrutina es reentrante, y por lo tanto seguro para subprocesos, si y sólo si

  • las únicas variables que utiliza son de la pila

, que de acuerdo con las respuestas a continuación, no es el caso)

+9

Use 'delete []' para arrays no 'delete' –

+0

@Brian: Woops - gracias. Agregué la parte de la matriz después de que ya había tipeado la función, para dejar en claro que estaba asignando memoria dinámicamente, pero olvidé agregar las []. +1 :) – Cam

+1

Es sorprendente ver el uso extendido de wikipedia como LA referencia para conceptos de programación :) – ch0kee

Respuesta

10

Si está codificando en un entorno que soporta multi-threading, entonces puede estar bastante seguro new es seguro para subprocesos.

Aunque la memoria está en el montón, el puntero está en la pila. Solo el hilo tiene el puntero a esta memoria, por lo que no hay riesgo de modificación concurrente, ningún otro hilo sabe dónde la memoria lo va a modificar.

Solo obtendría un problema con la seguridad del hilo si pasara este puntero a otro hilo que luego modificaría simultáneamente esta memoria al mismo tiempo que su hilo original (u otro).

+0

Gracias. Difícil elección entre su respuesta y la de Peter, pero su sugerencia útil al final fue relevante, mientras que la suya fue sobre vectores :) – Cam

0

nuevo y borrar puede o puede no ser seguro para subprocesos Probablemente lo sean, pero eso depende de la implementación. Ver: C++ new operator thread safety in linux and gcc 4

Para que sea seguro para la ejecución de subprocesos, una función debe usar variables de pila o sincronizar su acceso a otros recursos con otros subprocesos. Siempre que las llamadas separadas a las nuevas asignen diferentes espacios en el montón cuando se invocan desde diferentes hilos, debería estar bien.

2

No dice que solo puede usar variables de pila, dice que el uso de variables de pila "sugiere la necesidad de un examen cuidadoso para ver si no es seguro".

new y delete normalmente se implementan de forma segura para los hilos (aunque no estoy seguro de que el estándar lo garantice), por lo que su código anterior probablemente sea correcto.

recomendaciones habituales de uso de std::vector en lugar de asignar manualmente una matriz

Plus, pero supongo que sólo se ha proporcionado como un ejemplo :)

+1

Recuerdo que operaba en un entorno donde no lo estaban. Ahora * que * era peludo. – Joshua

+1

Es una suerte que puedas anularlos entonces :) –

Cuestiones relacionadas