new
y delete
son seguros para subprocesos
Se requieren las siguientes funciones para ser seguro para subprocesos:
- Las versiones de biblioteca de
operator new
yoperator delete
- Versiones de reemplazo de usuario de global
operator new
yoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Las llamadas a estas funciones que asignan o desasignan una unidad de almacenamiento en particular ocurren en un solo pedido total, y cada llamada de desasignación ocurre antes de la próxima asignación (si la hay) en este orden.
Con gcc, new
se implementa delegando a malloc
, y vemos que su malloc
de hecho usa un candado. Si le preocupa que su asignación cause cuellos de botella, escriba su propio asignador.
La respuesta es sí, pero en la práctica es generalmente no es un problema. Si es un problema para usted, puede intentar reemplazar su implementación de malloc con tcmalloc que reduce, pero no elimina la posible contención (ya que solo hay 1 montón que debe compartirse entre hilos y procesos).
TCMalloc asigna a cada subproceso una caché local de subprocesos. Las asignaciones pequeñas se satisfacen desde la memoria caché local de subprocesos. Los objetos se mueven desde estructuras de datos centrales a una caché local de subprocesos según sea necesario, y se utilizan recolecciones de basura periódicas para migrar la memoria de vuelta desde una caché local de subprocesos a las estructuras de datos centrales.
También hay otras opciones como usar asignadores personalizados y/o contenedores especializados y/o rediseñar su aplicación.