C ++ 11 contenedores STL y seguridad de rosca

Tengo problemas para encontrar información actualizada al respecto.

¿Las versiones C ++ 11 de los contenedores STL tienen algún nivel de seguridad de hilo garantizado?

Espero que no lo hagan, por motivos de rendimiento. Pero, una vez más, es por eso que tenemos std::vector::operator[] y std::vector::at .

Como las respuestas existentes no lo cubren (solo hace un comentario), mencionaré 23.2.2 [container.requirements.dataraces] de la especificación estándar actual de C ++ que dice:

se requieren implementaciones para evitar razas de datos cuando los contenidos del objeto contenido en diferentes elementos en la misma secuencia, excepto vector , se modifican simultáneamente.

es decir, es seguro acceder a distintos elementos del mismo contenedor, así que, por ejemplo, puede tener un std::vector> global de diez elementos y tener diez hilos que cada uno escriba en un elemento diferente del vector .

Aparte de eso, las mismas reglas se aplican a los contenedores que al rest de la biblioteca estándar (ver 17.6.5.9 [res.on.data.races]), como dice la respuesta del Sr. C64 , y adicionalmente [container.requirements.dataraces] enumera algunas funciones de miembros no const de contenedores que se pueden llamar de forma segura porque solo devuelven referencias no const a elementos, en realidad no modifican nada (en general, cualquier función miembro no const debe considerarse una modificación).

Creo que los contenedores STL ofrecen la siguiente garantía básica de seguridad de hilos:

  • lecturas simultáneas del mismo objeto están bien

  • lectura / escritura simultánea de diferentes objetos están bien

Pero debe usar alguna forma de sincronización personalizada (por ejemplo, la sección crítica) si desea hacer algo diferente, como, por ejemplo, escrituras simultáneas en el mismo objeto.

No. Verifique PPL o Intel TBB para conocer los contenedores tipo STL seguros para hilos.

Al igual que otros, han notado que tienen la “seguridad de hilo de lector múltiple” usual, pero eso es incluso anterior a C ++ 11. Ofc esto no significa escritor único lectores múltiples. Significa 0 escritores. 🙂