2010-01-31 13 views
13

Suppoes que tengo:¿Qué operaciones son seguras para hilos en std :: map?

stl::map<std::string, Foo> myMap; 

es el siguiente hilo de la función de seguridad?

myMap["xyz"] ? 

I.e. Quiero tener este gigantesco mapa de solo lectura que se comparte entre muchos hilos; pero no sé si incluso la búsqueda es segura para subprocesos.

Gracias!

EDIT:

Todo está escrito en vez primera.

Luego de eso, varios hilos leen.

Estoy tratando de evitar bloqueos para que esto sea lo más fabuloso posible. (yaya posible optimización prematura, lo sé)

Respuesta

11

En teoría, ningún contenedor STL es seguro para la rosca. En la práctica, la lectura es segura si el contenedor no se está modificando al mismo tiempo. es decir, el estándar no hace especificaciones sobre los hilos. La próxima versión de la voluntad estándar y IIUC garantizará un comportamiento seguro de solo lectura.

Si realmente está preocupado, use una matriz ordenada con búsqueda binaria.

2

Las colecciones de STL no son aptas para roscar, pero es bastante sencillo agregar seguridad de hilo a una.

Su mejor apuesta es crear un envoltorio de hilo alrededor de la colección en cuestión.

6

Al menos en la implementación de Microsoft, la lectura de los contenedores es segura para subprocesos (reference).

Sin embargo, std::map::operator[] puede modificar los datos y no está declarado const. En su lugar, debe usar std::map::find, que es const, para obtener un const_iterator y desreferenciarlo.

+0

para que haya algo en un contenedor, debe escribirse en. De ahí el problema de la seguridad del hilo ... –

+1

Las preguntas especifican que estamos mirando un mapa de solo lectura.Supongo que esto significa que se completa por completo en un hilo antes de ser leído de múltiples hilos. –

4

Teóricamente, las estructuras y funciones de datos de solo lectura no requieren cerraduras para seguridad de hilos. Es intrínsecamente seguro para subprocesos. Hay sin datos razas en lecturas concurrentes de memoria. Sin embargo, debe garantizar inicializaciones seguras con solo un hilo.

Como señaló Max S., la implementación en su mayoría de la lectura de un elemento en el mapa como myMap["xyz"] no tendría operaciones de escritura. Si es así, entonces es seguro. Pero, una vez más, debe garantizar que no hay ningún hilo que modifique la estructura, excepto la fase de inicialización.

7

C++ 11 requiere que todas las funciones de miembro declaradas como const sean seguras para subprocesos para varios lectores.

Llamar a myMap["xyz"] no es seguro para subprocesos, ya que std::map::operator[] no está declarado como const. Llamar a myMap.at("xyz") es seguro para subprocesos, ya que std::map::at se declara como const.

Cuestiones relacionadas