Al usar múltiples hilos, la memoria compartida debe ser bloqueada por secciones críticas. Sin embargo, el uso de secciones críticas causa bloqueos potenciales. ¿Cómo pueden evitarse?¿Cómo evitar interbloqueos?
Respuesta
Una forma es utilizar una jerarquía de las secciones críticas. Si se asegura de que nunca se ingrese una sección crítica principal dentro de uno de sus elementos secundarios, no pueden producirse bloqueos. La dificultad es hacer cumplir esta jerarquía.
Debe codificar los programas multihilo con mucho cuidado. No hay atajos, debe comprender el flujo de su programa, de lo contrario estará condenado.
Cuando trabajo en C++, las siguientes obras para mí:
todos los métodos públicos (excluyendo ctor y dtor) de una cerradura de clase multi-hilo
métodos privados no pueden llamar a métodos públicos
No es un método general para evitar interbloqueos.
La lista relacionada a la derecha de esta página contiene algunos enlaces que proporcionan información interesante sobre el tema.
Además de esa lista, hay muchas otras de las preguntas Para desarrollar el tema, tales como
... and many more
Gracias, echaré un vistazo a esas preguntas . –
Puedes evitar cri secciones ticas usando el mensaje pasando el en su lugar (llamadas síncronas y asíncronas). Cuando usa llamadas síncronas, aún debe asegurarse de no hacer una llamada circular, en la que el subproceso A hace una pregunta a B, y B necesita hacer una pregunta para poder responder.
Otra opción es realizar llamadas asincrónicas en su lugar. Sin embargo, es más difícil obtener valores de retorno.
Nota: De hecho, un sistema de paso de mensajes se implementa mediante una sección crítica que bloquea la cola de llamadas, pero se abstrae.
Entre los diversos métodos para ingresar a secciones críticas, los semáforos y mutex son los más populares.
Un semáforo es un mecanismo de exclusión mutua de espera y es un mecanismo de bloqueo, así que el concepto es confuso para la mayoría, pero en fin, un hilo de activar un mutex sólo puede desactivarlo. Teniendo esto en cuenta...
No permita que ningún proceso bloquee un número parcial de recursos, si un proceso necesita 5 recursos, espere hasta que todos estén disponibles.
- si usa semáforo aquí, puede desbloquear/desechar el recurso ocupado por otro hilo. con esto me refiero a la preferencia es otra razón.
Estas 2 según yo son las condiciones básicas, las 2 restantes de las 4 precauciones comunes pueden estar relacionadas con estas.
Si no está de acuerdo, añada comentarios. Ya llegué tarde, luego agregaré una explicación más clara y más clara.
ALGORITMO se utiliza el siguiente evitar un punto muerto:
algoritmo del banquero
-Impose condiciones menos estrictas que en la prevención de estancamiento en un intento de conseguir una mejor utilización de los recursos
estado -Safe
• El sistema operativo puede garantizar que todos los procesos actuales puedan completar su trabajo dentro de un tiempo finito
estado -Unsafe
• no implica que el sistema está en un punto muerto, pero que el sistema operativo no puede garantizar que todos los procesos actuales pueden completar su trabajo dentro de un tiempo finito
-Requiere que los recursos se asignen a procesa solo cuando las asignaciones resultan en estados seguros. -Tiene una serie de puntos débiles (como requerir un número fijo de procesos y recursos) que impiden que se implemente en sistemas reales
Hola y bienvenido. Puede publicar una respuesta mejor al explicar más detalladamente lo que ha hecho. ¿Has usado el algoritmo? En que situación? ¿Por qué lo recomiendas en este caso? –
- 1. Transacciones - ¿Cómo evitar interbloqueos?
- 2. ¿Cómo implemento este comando para evitar interbloqueos con LINQ to SQL?
- 3. Cómo detectar interbloqueos en Mysql/innodb?
- 4. Historial de interbloqueos en Oracle?
- 5. interbloqueos en MySQL filas eliminación
- 6. ¿Cuáles son los ajustes requeridos de C3P0 para hibernación para evitar interbloqueos?
- 7. Multithreading: evitar y ocuparse de los interbloqueos de la base de datos
- 8. Diagnóstico de interbloqueos en el programa Win32
- 9. ¿Cuál es la diferencia entre la prevención de interbloqueos y la prevención de interbloqueos?
- 10. Pruebas unitarias, interbloqueos y condiciones de carrera
- 11. ORM Soporte para la manipulación de interbloqueos
- 12. Incrustación de Python con subprocesos, ¿evitando interbloqueos?
- 13. SQL Server interbloqueos entre seleccionar/actualizar o múltiples selecciones
- 14. Cómo evitar NHibernate.NonUniqueObjectException
- 15. ¿Cómo evitar decir "gstring"?
- 16. Java: Cómo evitar StackOverflowException
- 17. ¿Cómo evitar el downcast?
- 18. cómo evitar bucles
- 19. ¿Cómo evitar Undefined offset
- 20. Cómo evitar los parámetros?
- 21. Cómo evitar una sesión
- 22. cómo evitar que css herede
- 23. Cómo evitar problemas de GeneratedSerializationConstructorAccessor?
- 24. NSKeyedUnarchiver: cómo evitar un bloqueo
- 25. ¿Cómo evitar el cálculo innecesario?
- 26. ¿Cómo evitar los archivos .pyc?
- 27. Cómo evitar una excepción System.Runtime.InteropServices.COM?
- 28. Cómo evitar la inyección XML
- 29. PHP: ¿cómo evitar redeclarar funciones?
- 30. cómo evitar dependencias circulares aquí
¿Por qué el voto a favor? Y más importante aún, ¿por qué se cierra esto? –
hacer esta wiki de la comunidad - en este momento solo se ve como la agricultura de reputación –
Hm. Me pareció una pregunta perfectamente válida, una que realmente me gustaría ver respondida. –