resueltos programas programar programa funciones ejercicios ejemplos como comandos codigos avanzados c++ multithreading c++11

programas - Un bloqueo RW para c++ 11 hilos



programa en c++ (2)

Esta pregunta ya tiene una respuesta aquí:

Me gustaría usar los nuevos subprocesos estándar en lugar de aumentar: subprocesos, pero he notado que el antiguo shared_mutex no está disponible. ¿Cuál sería una buena recomendación para reemplazar esta funcionalidad y darme un bloqueo de un solo escritor y varios lectores?


Debe consultar la pregunta de desbordamiento de pila " C ++ 11 equivalente a boost shared_mutex " y, en particular, la siguiente conversación de correo electrónico vinculada: http://permalink.gmane.org/gmane.comp.lib.boost.devel/211180 (lo que explica la resistencia del comité de C ++ 11 a aprobar shared_mutex). También el experimento siguiente en el weblog de Joe Duffy: http://www.bluebytesoftware.com/blog/2009/02/12/ReaderwriterLocksAndTheirLackOfApplicabilityToFinegrainedSynchronization.aspx .

Cada vez que esté considerando un bloqueo de lector / escritor, hágase las siguientes 6 preguntas. Si puede responder "no" a cualquiera de ellos, los bloqueos de lector / escritor van a empeorar su programa, no a mejorar.

  1. ¿Es mi objeto compartido const ? He visto más usos incorrectos de shared_mutex en mi vida que usos correctos. Para utilizar un shared_mutex correctamente, debe declarar que sus objetos compartidos se encuentran dentro de la sección crítica del lector sin ninguna queja del compilador. Un "consumidor" no es equivalente a "alguien que no muta la estructura de datos".
  2. ¿Son mis secciones críticas realmente largas? Bloquear un shared_mutex es mucho más costoso que bloquear un mutex regular. Tiene que tener mucho trabajo en su sección crítica para compensar la sobrecarga mayor de la adquisición / liberación del bloqueo.
  3. ¿Deben mis secciones críticas ser tan largas? Debe preguntarse si realmente necesita estar haciendo todo ese trabajo en una sección crítica. A menudo hay un montón de trabajo preparatorio y / o trabajo para masajear el objeto de retorno que rodea las llamadas const al objeto compartido. Gran parte de ese trabajo adicional que no está en la ruta de la dependencia de datos desde el primer uso del objeto compartido hasta el último uso del objeto compartido se puede mover fuera de la sección crítica.
  4. ¿Es la contención de bloqueo realmente mi problema de rendimiento? Incluso si sus secciones críticas son largas, debe estar absolutamente seguro de que la contención de bloqueo es realmente su problema de rendimiento. Si no está experimentando una contención de bloqueo significativa, cambiar a los bloqueos de lector / escritor no le va a comprar nada.
  5. ¿Podría reducir mi contención de bloqueo cambiando a un esquema de bloqueo de grano más fino? ¿Está utilizando un solo bloqueo para proteger varios objetos? ¿Puedes darle a cada objeto su propio candado?
  6. ¿Es la proporción de lectores a escritores significativamente mayor que 1: 1? Incluso si sus secciones críticas son largas y la contención de bloqueos es un problema grave, la proporción de lectores a escritores debe ser extremadamente alta para obtener algún beneficio de los bloqueos de lector / escritor. La cantidad depende de los costos de las instrucciones atómicas en su hardware y de la calidad de las implementaciones particulares. (Joe Duffy encuentra que en su máquina necesitaba una proporción de alrededor de 20: 1 lectores: escritores para hacer que el lector / escritor bloquee una victoria).

std::shared_mutex será parte de la biblioteca estándar de C ++ 14. No llegó a C ++ 11 solo porque no había tiempo para formular una propuesta y discutirla a fondo.

Aún puedes usar boost::shared_mutex sin embargo. Bajo Windows, si está trabajando con Windows Vista o una versión posterior, puede usar los bloqueos de lectura / escritura delgados , que están optimizados para la velocidad y el consumo de memoria.