¿Es seguro el hilo std :: vector o boost :: vector?

Tengo varios hilos simultáneamente llamando a push_back() en un objeto compartido de std::vector . ¿Es seguro el hilo std::vector ? ¿O necesito implementar el mecanismo yo mismo para que sea seguro?
Quiero evitar realizar trabajos adicionales de “locking y liberación” porque soy un usuario de la biblioteca en lugar de un diseñador de la biblioteca. Espero buscar soluciones existentes de subprocesos seguros para vector. ¿Qué hay de boost::vector , que se introdujo recientemente de impulsar 1.48.0 en adelante. ¿Es seguro para subprocesos?

El estándar C ++ ofrece ciertas garantías de enhebrado para todas las clases en la biblioteca estándar de C ++. Estas garantías pueden no ser lo que esperaría que fueran, pero para todas las clases de bibliotecas C ++ estándar se hacen ciertas garantías de seguridad de subprocesos. Sin embargo, asegúrese de leer las garantías, ya que las garantías de subprocesamiento de los contenedores estándar de C ++ generalmente no se alinean con lo que usted desearía. Para algunas clases se hacen garantías diferentes, generalmente más fuertes, y la respuesta a continuación se aplica específicamente a los contenedores. Los contenedores esencialmente tienen las siguientes garantías de seguridad de hilos:

  1. puede haber múltiples lectores simultáneos del mismo contenedor
  2. si hay un escritor, no habrá más escritores ni lectores

Normalmente no son lo que las personas querrían como garantías de seguridad de subprocesos, pero son muy razonables dada la interfaz de los contenedores estándar: están destinados a ser utilizados de manera eficiente en ausencia de múltiples hilos de acceso. Agregar cualquier tipo de locking para sus métodos interferiría con esto. Más allá de esto, la interfaz de los contenedores no es realmente útil para ninguna forma de locking interno: generalmente se usan múltiples métodos y los accesos dependen del resultado de accesos previos. Por ejemplo, después de haber comprobado que un contenedor no está empty() se puede acceder a un elemento. Sin embargo, con el locking interno no hay garantía de que el objeto aún esté en el contenedor cuando realmente se acceda a él.

Para cumplir con los requisitos que brindan las garantías anteriores, probablemente tendrá que usar alguna forma de locking externo para los contenedores accedidos simultáneamente. No sé sobre los contenedores de impulso, pero si tienen una interfaz similar a la de los contenedores estándar, sospecho que tienen exactamente las mismas garantías.

Las garantías y requisitos se dan en 17.6.4.10 [res.on.objects], párrafo 1:

El comportamiento de un progtwig no está definido si las llamadas a funciones de biblioteca estándar de diferentes hilos pueden introducir una carrera de datos. Las condiciones bajo las cuales esto puede ocurrir se especifican en 17.6.5.9. [Nota: la modificación de un objeto de un tipo de biblioteca estándar que se comparte entre hilos corre el riesgo de un comportamiento indefinido a menos que los objetos de ese tipo se especifiquen explícitamente como compartibles sin razas de datos o el usuario proporcione un mecanismo de locking. -Finalización]

… y 17.6.5.9 [res.on.data.races]. Esta sección esencialmente detalla la descripción más informal en el no.

Tengo varios hilos simultáneamente llamando a push_back () en un objeto compartido de std :: vector. ¿Es seguro el hilo std :: vector?

Esto no es seguro .

¿O necesito implementar el mecanismo yo mismo para que sea seguro?

Sí.

Quiero evitar realizar trabajos adicionales de “locking y liberación” porque soy un usuario de la biblioteca en lugar de un diseñador de la biblioteca. Espero buscar soluciones existentes de subprocesos seguros para vector.

Bueno, la interfaz del vector no es óptima para el uso concurrente. Está bien si el cliente tiene acceso a un locking, pero para la interfaz para el locking abstracto para cada operación – no. De hecho, la interfaz de vector no puede garantizar la seguridad del hilo sin un locking externo (suponiendo que necesita operaciones que también cambian).

¿Qué hay de boost :: vector, que se introdujo recientemente de impulsar 1.48.0 en adelante. ¿Es seguro para subprocesos?

Estado de los documentos:

 //! boost::container::vector is similar to std::vector but it's compatible //! with shared memory and memory mapped files. 

Tengo varios hilos simultáneamente llamando a push_back () en un objeto compartido de std :: vector. … Espero buscar soluciones existentes de subprocesos seguros para vector.

Eche un vistazo a concurrent_vector en Intel TBB . Estrictamente hablando, es bastante diferente de std::vector internamente y no es totalmente compatible con API, pero aún así podría ser adecuado. Puede encontrar algunos detalles de su diseño y funcionalidad en los blogs de los desarrolladores de TBB .