2010-12-24 19 views
24

Tengo curiosidad acerca de si hay un bloqueo en la asignación de memoria si dos subprocesos solicitan simultáneamente asignar memoria. Estoy usando OpenMP para hacer código multihilo, C++.En multiproceso C/C++, hace malloc/new bloquear el montón al asignar memoria

SO: principalmente Linux, pero me gustaría saber también para Windows y Mac.

+2

¿Tiene miedo de que a dos hilos se les asigne la misma memoria? Si es así, no debes preocuparte. Si malloc no era seguro para subprocesos, no sería el primero en descubrirlo. Si tu pregunta es -how- does malloc lograr seguridad hilo, eso depende de la implementación. – EnabrenTane

+0

Mi pregunta se relacionó más con el rendimiento al asignar hilos paralelos. –

Respuesta

14

Podría haber mejoras en ciertas implementaciones, como la creación de un caché específico de subprocesos (en este caso las asignaciones de bloques pequeños estarán libres de bloqueos). Por ejemplo, this de Google. Pero en general, sí, hay un bloqueo en las asignaciones de memoria.

+0

Enlace muy interesante sobre TCMalloc, gracias! –

7

De forma predeterminada, Windows bloquea el montón cuando utiliza las funciones del montón Win API.

Puede controlar el bloqueo al menos en el momento de la creación del montón. Diferentes compiladores y tiempos de ejecución hacen cosas diferentes con la familia malloc/free. Por ejemplo, la API de SmartHeap en un punto creó un montón por hilo y, por lo tanto, no necesitó bloqueo. También había opciones de configuración para activar y desactivar ese comportamiento.

En un momento a principios/mediados de los 90, los compiladores Borland Windows y OS/2 desactivaron explícitamente el bloqueo de Heap (una falla de optimización prematura) hasta que se lanzaron varios subprocesos con beginthread. Muchas muchas personas trataron de generar roscas con una llamada a la API del sistema operativo y luego se sorprendieron cuando la pila se corrompió al infierno ...

6

http://en.wikipedia.org/wiki/Malloc

implementaciones de malloc modernos tratan de ser lo más lock-libre como sea posible, manteniendo separar "arenas" para cada hilo.

+4

Wikipedia no es una [fuente autorizada] (http://chronicle.com/blogs/wiredcampus/wikipedia-founder-discourages-academic-use-of-his-creation/2305): utilícela como punto de partida para aprender y encontrar fuentes autorizadas. Pero no debe citarse, ya que no es una fuente autorizada. –

+14

El enlace es útil, independientemente de si es autorizado o no. No estamos escribiendo artículos académicos aquí. – nobar

5

La tienda gratuita es un recurso compartido y debe estar sincronizado. La asignación/desasignación es costosa. Si tiene varios hilos para el rendimiento, la frecuente asignación/desasignación puede convertirse en un cuello de botella. Como regla general, evite la asignación/desasignación dentro de bucles estrechos. Otro problema es el intercambio falso.

Cuestiones relacionadas