2011-11-22 14 views
8

Esto se trata de seguridad de hilo de std::map. Ahora, las lecturas simultáneas son seguras para hilos, pero las escrituras no lo son. Mi pregunta es si agrego un elemento único al mapa cada vez, ¿será seguro para subprocesos?Thread-safety of C++ maps

  1. Así, por ejemplo, si tengo un mapa como este std:map<int, std::string> myMap y siempre añadir nuevas claves y nunca modificar el valor de clave existente, tendrá que ser flujos seguros?

  2. Más importante aún, ¿me dará algún comportamiento aleatorio en tiempo de ejecución?

  3. ¿Agregar nuevas claves también se considera una modificación? Si las claves son siempre diferentes al agregar, ¿no debería ser seguro para subprocesos ya que modifica una parte independiente de la memoria?

Gracias Shiv

+0

No, esto no será seguro para subprocesos, porque dos subprocesos podrían agregar dos elementos (únicos) a la vez que irían en el mismo lugar. –

+0

El único tipo de seguridad de subprocesos que puede esperar de los contenedores estándar es que si el contenedor nunca se modifica y cada subproceso accede (lee o escribe) un elemento ** diferente **, entonces eso debería estar bien. –

Respuesta

14

1) Por supuesto que no

2) Sí, espero que te vas a encontrar durante las pruebas, a más

3) Sí, lo es. El nuevo elemento se agrega en una ubicación diferente, pero muchos punteros se modifican durante ese.

El mapa está implementado por algún tipo de árbol en la mayoría de las implementaciones, si no todas. Insertar un nuevo elemento en un árbol lo modifica al reorganizar los nodos mediante el restablecimiento de los punteros para apuntar a diferentes nodos. Por lo tanto, no es seguro para subprocesos

+1

+1, exactamente .... –

+0

@armen ¿cuál es la mejor alternativa? –

+0

@EdwinVivekN: Necesita utilizar mecanismos de sincronización externos (por ejemplo, mutexes) cuando trabaja con contenedores STL concurrentemente –

0

no, sí, sí. Debe obtener un bloqueo exclusivo cuando modifique el contenedor (incluida la inserción de nuevas claves), aunque si bien no hay modificaciones, puede, por supuesto, leer de forma segura al mismo tiempo.

editar: http://www.sgi.com/tech/stl/thread_safety.html puede ser de interés para usted.