Depende de lo que esperas. Las otras respuestas son correctas que en general, los contenedores C++ estándar no son seguros para subprocesos, y además, que en particular su código no protege contra otro subproceso que modifica el contenedor entre su llamada al empty
y la adquisición del bloqueo (pero este asunto no está relacionado con la seguridad del hilo de vector::empty
).
Por lo tanto, para evitar malentendidos: Su código no garantiza items
no estará vacío dentro del bloque.
Pero su código todavía puede ser útil, ya que todo lo que quiere hacer es evitar creaciones de bloqueo redundantes. Su código no da garantías, pero puede evitar una creación de bloqueo innecesario. No funcionará en todos los casos (otros hilos aún pueden vaciar el contenedor entre su cheque y el candado) pero en algunos casos. Y si todo lo que busca es una optimización al omitir un bloqueo redundante, entonces su código logra ese objetivo.
Sólo asegúrese de que cualquier real el acceso al contenedor es protegido por las cerraduras.
Por cierto, Lo anterior es, estrictamente hablando comportamiento indefinido: una implementación STL se permite teóricamente modificar mutable
miembros dentro de la llamada a empty
. Esto significa que la llamada aparentemente inofensiva (porque solo lectura) a empty
puede en realidad causar un conflicto. Desafortunadamente, no puede confiar en la suposición de que las llamadas de solo lectura son seguras con los contenedores STL.
En la práctica, sin embargo, estoy bastante seguro de que se vector::empty
no modificar ningún miembros.Pero ya para list::empty
estoy menos seguro. Si realmente desea garantiza, entonces bloquee cada acceso o no use los contenedores STL.
Gracias por las respuestas. Para aclarar la pregunta: Se agregará otro hilo a los artículos. No se eliminará ningún otro subproceso de los elementos: solo se eliminarán dentro de DoStuffWithItems() y solo un subproceso llama a DoStuff(). Está bien si items.empty() devuelve falso mientras que otro hilo se está agregando a él. No está bien si items.empty() hace que la aplicación se bloquee si se le agrega otro hilo –