usar - En C/C++ multiproceso, malloc/new bloquea el montón al asignar memoria
memoria dinamica en c ejemplos (4)
De forma predeterminada, Windows bloquea el montón cuando utiliza las funciones del montón de la API de Win.
Puede controlar el bloqueo al menos en el momento de la creación del montón. Los diferentes compiladores y tiempos de ejecución de C hacen cosas diferentes con la familia malloc / free. Por ejemplo, la API de SmartHeap en un punto creó un montón por subproceso y, por lo tanto, no necesitaba bloqueo. También había opciones de configuración para activar y desactivar ese comportamiento.
En un momento, a principios o mediados de los años 90, los compiladores de Borland Windows y OS / 2 desactivaron explícitamente el bloqueo de Heap (un error de optimización prematura) hasta que se lanzaron varios subprocesos con threading inicial. Muchas personas intentaron generar subprocesos con una llamada de la API del sistema operativo y luego se sorprendieron cuando el montón se corrompió al infierno ...
Tengo curiosidad por saber si hay un bloqueo en la asignación de memoria si dos subprocesos solicitan simultáneamente asignar memoria. Estoy usando OpenMP para hacer multiprocesamiento, código C ++.
SO: principalmente Linux, pero también me gustaría saberlo para Windows y Mac.
Free store es un recurso compartido y debe estar sincronizado. La asignación / desasignación es costosa. Si es multihilo para el rendimiento, la asignación / desasignación frecuente puede convertirse en un cuello de botella. Como regla general, evite la asignación / desasignación dentro de bucles estrechos. Otro problema es el falso compartir.
Podría haber mejoras en ciertas implementaciones, como la creación de un caché específico de subproceso (en este caso, las asignaciones de bloques pequeños no tendrán bloqueo). Por ejemplo, this de Google. Pero en general, sí, hay un bloqueo en las asignaciones de memoria.
http://en.wikipedia.org/wiki/Malloc
Las implementaciones de malloc modernas intentan ser lo más libres de bloqueos posibles manteniendo "arenas" separadas para cada hilo.