2010-11-05 31 views
7

duplicados posibles:
Is the C++ STL std::set thread-safe?
Thread safety for STL queue¿Está usando std :: deque o std :: priority_queue thread-safe?

que supongo que no es, simplemente quieren asegurarse. significado 2 hilos usando el mismo std :: deque usando std::deque::push_back o push_front al mismo tiempo.

La misma pregunta se aplica a std::priority_queue y las funciones std::priority_queue::push y std::priority_queue::pop ..

son aquellos contenedores compatibles con el proceso? ¿O debería programarlo personalmente para que sea seguro para subprocesos?

Tnx mucho.

+0

Posible duplicado - http: // stackoverflow.com/questions/1362110/is-the-c-stl-stdset-thread-safe – DumbCoder

Respuesta

10

De $ STL eficaz de Scott Myer 12. tener expectativas realistas acerca de la seguridad de los subprocesos de contenedores STL

múltiples lectores son seguros. Múltiples hilos pueden leer simultáneamente el contenido de un único contenedor, y esto funcionará correctamente. Naturalmente, no debe haber escritores que actúen en el contenedor durante las lecturas.

Múltiples escritores a diferentes contenedores son seguros. Múltiples hilos pueden escribir simultáneamente en diferentes contenedores.

Cuando se trata de enhebrar de forma segura y contenedores STL, puede esperar una implementación de biblioteca que permita varios lectores en un contenedor y varios escritores en contenedores separados. No puede esperar que la biblioteca elimine la necesidad del control de concurrencia manual y no puede confiar en ningún soporte de subprocesos.

+5

"Hope" no es una palabra que me guste ver en las expectativas de seguridad de subprocesos;) –

+1

Por filosóficamente pertinente que pueda ser esta cita, es sin ningún rastro de practicidad. Por lo que sé para cualquier implementación de stl deque, sé que también es incorrecto leer y escribir en RE. – easytiger

2

El STL no proporciona ninguna garantía para la seguridad de la rosca. Este es especialmente el caso cuando se modifica el mismo contenedor de múltiples hilos.

La implementación de la STL que está utilizando puede proporcionar cierto nivel de seguridad de subprocesos, pero deberá consultar la documentación para su implementación.

1

Cuando dice que son seguros para los subprocesos, es posible que quiera decir que puede usarlos en varios subprocesos sin tener que bloquear nada.

push_back y push_front no invalidan los iteradores en std :: deque, por lo que podría tener 2 hilos, uno empujando hacia atrás y otro al frente, y probablemente se saldría con la suya, aunque sería cauteloso porque el implementador no tiene la garantía de hacerlo seguro y puede hacer algunas cosas internas que no sean seguras para subprocesos.

std :: priority_queue es casi seguro que no se puede usar en dos hilos juntos, presumiblemente para hilos productores/consumidores, con un empuje y un estallido y tendrá que bloquear primero.

Descubrí que cuando escribí una cola de productor/consumidor basada en std :: deque, permití que el productor también empujara más de un elemento a la vez y que el consumidor barriera toda la cola para procesarla.

Cuestiones relacionadas