Sé que esto se ha preguntado antes (y seguiré investigando), pero necesito saber cómo hacer que una función de lista vinculada particular funcione de manera segura. Mi problema actual es que tengo un hilo que recorre todos los elementos en una lista vinculada, y otro puede agregar más elementos al final de esta lista. A veces ocurre que el único hilo intenta agregar otro elemento a la lista mientras que el primero está ocupado iterando a través de él (lo que causa una excepción).Hacer que una lista enlazada sea segura
Estaba pensando en solo agregar una variable (indicador booleano) para decir que la lista está actualmente ocupada siendo iterada, pero ¿cómo la verifico y espero con el segundo hilo (está bien si espera, como el primer hilo se ejecuta bastante rápido). La única forma en que puedo pensar en hacer esto es mediante el uso de un ciclo while constantemente revisando esta bandera ocupada. Me di cuenta de que esta era una idea muy tonta ya que haría que la CPU trabajara duro sin hacer nada útil. Y ahora estoy aquí para pedir una mejor idea. He leído sobre cerraduras y demás, pero no parece ser relevante en mi caso, pero ¿quizás estoy equivocado?
Mientras tanto, seguiré buscando en Internet y publicando si encuentro una solución.
EDITAR: Avíseme si debo publicar algún código para aclarar las cosas, pero lo intentaré y lo explicaré más claramente.
Tengo una clase con una lista vinculada que contiene elementos que requieren procesamiento. Tengo un hilo que itera a través de esta lista a través de una llamada a función (llamémoslo "processElements"). Tengo un segundo hilo que agrega elementos para procesar de una manera no determinista. Sin embargo, a veces ocurre que intenta llamar a esta función addElement mientras se está ejecutando processElements. Esto significa que el elemento an se está agregando a la lista vinculada mientras el primer hilo lo itera. Esto no es posible y causa una excepción. Espero que esto lo aclare.
Necesito el hilo que agrega elementos nuevos para ceder hasta que el método processElements termine de ejecutarse.
- Para cualquier persona que tropiece con este problema. La respuesta aceptada le dará una solución rápida y fácil, pero consulte la respuesta de Brian Gideon a continuación para obtener una respuesta más completa, ¡que definitivamente le dará más información!
Usted está equivocado. Los bloqueos son * exactamente * lo que necesita. –
Eso está bien (de ahí "quizás estoy equivocado"). Sin embargo, gracias, lo seguiré hasta que descubra cómo aplicarlo. +1 a usted para proporcionar la solución – Denzil
Debe hacer que el método de la lista sea seguro para las amenazas, no 'a'. Y eso ha sido preguntado y respondido muchas veces. –