Ahora que estoy repasando mentalmente todas las estructuras de datos ya implementadas para poderlas separar en módulos funcionales rígidos y cada módulo tener un servidor, clientes y objetos remotos... he caído en un error en la programación de los diccionarios.
Cuando programé los hilos para que se ejecutase la inserción de las er concurrentemente resultaba que tardaba incluso más que sin hilos. Un hilo bloqueaba a los demás y no se llegaba a generar el paralelismo.
Comenté que se debería a la dependencia entre er y a dependencia entre las estructuras de datos. Pues ahora he dado con otro factor más: el pivote de los diccionarios.
Mis diccionarios son árboles en los que en todas los nodos se insertan listas como en el caso del diccionario de listas, o sólo en los nodos hoja se insertan listas (equivalentes) en el diccionario de er, o sólo en los nodo hoja la er en el diccionario de nombres.
Tienen en común que se recorre el árbol nodo a nodo mediante el puntero pivote. Un único pivote. Si un hilo quiere saber si un string está almacenado tiene que:
- pivote = nodo raíz del árbol.
- para todos los caracteres de la cadena, de izquierda a derecha
- si algún hijo del nodo que apunta el pivote es el caracter:
- pivote = nodo hijo que lo contiene.
- si no, no está almacenada en el árbol.
- si no quedan caracteres por evaluar:
- sí está almacenado.
- si no, no lo está.
El problema es que no se pueden ejecutar dos consultas simultáneamente ya que el pivote volvería a la raíz sin haber terminado la consulta de otro hilo. La solución que tomé fue la de sincronizar todos los métodos que tocaban el pivote. El resultado es que no existe concurrencia real. Lo mismo ocurre con las otras funciones de modificación, inserción o eliminación ya que todas usan el pivote.
Solución: cada hilo cree su propio pivote privado.
No hay comentarios:
Publicar un comentario