Pregunta

He aprendido que simplemente en función del lenguaje C malloc viene con el problema de contención hilo cuando se utiliza en un aplicaciones de subprocesos múltiples.

En C ++ operator new sufren el mismo problema? Si es así qué tecnhique pueden usar para evitar esto que suena como una gran penalización en el rendimiento de las aplicaciones?

¿Fue útil?

Solución

Ese "problema" de la discordia hilo realmente depende de la implementación. Algunas de las implementaciones de malloc en uso común no fueron originalmente diseñados con múltiples hilos en mente. Sin embargo, una implementación de malloc diseñado para aplicaciones multitarea, no debe sufrir de contención en circunstancias normales.

Como un ejemplo de una implementación de malloc diseñado con múltiples hilos en mente, vistazo a jemalloc .

Otros consejos

En función de las implementaciones de nuevo, pero ya que suele ser malloc sí en base. Aquí algunas cosas que puede hacer:

  • Utilice un generador de perfiles para contar el número de llamadas a malloc() (y tal vez brk()) por segundo, asegúrese de que tiene un problema de contención con malloc().
  • tratar de trabajar con un asignador de memoria en paralelo (es decir. tesoro )
  • Uso de la pila siempre que sea posible: no llamar nueva cuando no es necesario. Asimismo, recuerda que las copias pequeñas suelen ser más amigable caché que los punteros y los datos compartidos entre los hilos.
  

En C ++ operador de nuevo sufren el mismo problema?

Sí, en la mayoría de las implementaciones, lo hace.

Si se encuentra en C ++ ya, Threading Building Blocks es una biblioteca de plantillas de C ++ que debe adaptarse tus necesidades. Tiene asignadores escalables, estructuras de datos, una página web y más ...

El problema con la afirmación hilo en malloc se reduce simplemente que el montón debe estar protegido por un mutex de dispositivo similar cada vez que se actualiza. Si dos hilos actualizar el montón al mismo tiempo que tendrá una condición de carrera. El mismo problema se aplica a nuevo, así que no hay ninguna razón fundamental por la cual uno debe tener menos de contención que el anterior.

Una vez dicho esto, hay una serie de trucos para minimizar la contención. La primera es para romper el montón arriba en Arenas separadas. Cada Arena tiene su propio candado. Si un hilo intenta asignar la memoria y la Arena está bloqueado, sólo se trata de asignar de la siguiente Arena.

Libera necesitará acceder a la misma arena que se utilizó para un malloc. Esto también se puede optimizar lugar el puntero para ser liberado en una lista libre. Esto se puede hacer de forma atómica. Cuando la arena al lado se desbloquea, todos los punteros de la lista libre conseguirá liberado correctamente.

Estas técnicas ayudan a prevenir pero no eliminar la contención de los cuales los medios en un modelo de hilos productor al consumidor, que puede ser mejor tener los punteros de paso del consumidor al productor en el que puedan ser reutilizados o eliminados según sea apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top