es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué garantiza la biblioteca estándar de C++ para evitar carreras de datos?

Leyendo el FAQ de C++11 — Threads en el enlace https://www.stroustrup.com/C++11FAQ.html#std-threads, hay un párrafo que no comprendo:

En consecuencia, C++11 proporciona algunas reglas/garantías para que el programador evite condiciones de carrera (data races):

  • Una función de la biblioteca estándar de C++ no debe acceder directa o indirectamente a objetos accesibles por hilos distintos al hilo actual, a menos que los objetos sean accedidos directa o indirectamente a través de los argumentos de la función, incluyendo “this”.
  • Una función de la biblioteca estándar de C++ no debe modificar directa o indirectamente objetos accesibles por hilos distintos al hilo actual, a menos que los objetos sean modificados directa o indirectamente a través de los argumentos no const de la función, incluyendo “this”.
  • Las implementaciones de la biblioteca estándar de C++ están obligadas a evitar condiciones de carrera cuando se modifican concurrentemente diferentes elementos pertenecientes a la misma secuencia.

Entiendo qué es una condición de carrera y la programación multihilo en general, pero no comprendo lo que estas oraciones están diciendo.

¿Podría explicarlas de manera más clara? ¿Quizás con un ejemplo? ¿Qué puedo o no puedo hacer de manera segura (como programador de aplicaciones) en un contexto multihilo?

Si no hubiera leído esto, habría supuesto que no es seguro tener varios hilos llamando a un método no constante de un objeto de cualquier tipo, pero supongo que esto está diciendo algo adicional a eso.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El párrafo al que te refieres está hablando de las reglas/garantías en C++11 que ayudan a prevenir las carreras de datos. Una carrera de datos ocurre cuando dos o más hilos acceden concurrentemente a la misma ubicación de memoria y al menos uno de esos accesos es una operación de escritura.

    Para evitar carreras de datos, el estándar C++11 proporciona algunas pautas para los programadores:

    1. Una función de la biblioteca estándar de C++ no debe acceder directa o indirectamente a objetos que sean accesibles por hilos que no sean el hilo actual, a menos que los objetos se accedan directa o indirectamente a través de los argumentos de la función (incluido “this”).

    Esto significa que si tienes varios hilos accediendo a los mismos datos, debes asegurarte de que cada hilo tenga acceso exclusivo a los datos con los que está trabajando. Si una función de la biblioteca accede a datos que son compartidos por varios hilos, solo debe hacerlo a través de los argumentos pasados a la función. Esto asegura que solo el hilo que tiene acceso a los datos pueda modificarlos.

    1. Una función de la biblioteca estándar de C++ no debe modificar directa o indirectamente objetos que sean accesibles por hilos que no sean el hilo actual, a menos que los objetos se accedan directa o indirectamente a través de los argumentos no constantes de la función (incluido “this”).

    Esto es similar a la primera pauta, pero con énfasis en la modificación de datos. Una función de la biblioteca no debe modificar datos que sean compartidos por varios hilos, a menos que se le haya pasado una referencia a los datos compartidos. Al requerir una referencia no constante a los datos compartidos, la función señala al programador que puede modificar los datos, y el programador puede tomar las medidas apropiadas para garantizar la seguridad de los hilos.

    1. Las implementaciones de la biblioteca estándar deben evitar carreras de datos cuando se modifican concurrentemente diferentes elementos de la misma secuencia.

    Esta pauta se aplica a secuencias, que se definen como contenedores que admiten iteración, como vectores o listas enlazadas. Si varios hilos están modificando diferentes elementos dentro del mismo contenedor, la implementación de la biblioteca estándar debe garantizar que se eviten las carreras de datos.

    En general, al escribir código multihilo, debes esforzarte por garantizar que cada hilo tenga acceso exclusivo a los datos con los que está trabajando. Puedes hacer esto utilizando mecanismos de sincronización como bloqueos o mutex, o dividiendo los datos de manera que cada hilo opere en un conjunto de datos separado. Las pautas proporcionadas por C++11 ayudan a garantizar que las funciones de la biblioteca sean seguras por defecto, pero aún depende del programador garantizar la seguridad de los hilos al utilizar esas funciones.

Comments are closed.