Asumimos el siguiente modelo del sistema distribuido:
Para detectar la terminación de todos los procesos acordamos lo siguiente:
Un ejemplo para la detección de terminación es el algoritmo de Dijkstra-Scholten.
Asumimos primero que el grafo de los procesos (es decir, el grafo que se establece por los intercambios de mensajes entre los procesos) forme un árbol. Esta situación no es tan raro considerando los muchos problemas que se puede solucionar con estrategias de divide-y-vencerás.
La detección de terminación resulta fácil: una hija en el arbol manda y su madre que ha terminado cuando haya recibido el mismo mensaje de todas sus hijas y cuando se ha decido terminar también.
El programa termina cuando la raíz del árbol ha terminado, es decir, cuando ha recibido todas las señales de terminación de todas sus hijas y no queda nada más por hacer. La raíz propaga la decisión que todos pueden terminar definitivamente a lo largo del árbol.
Ampliamos el algoritmo para que funcione también con grafos acíclicos. Añadimos a cada arista un campo ``déficit'' que se aumenta siempre que se haya pasado un mensaje entre los procesos a ambos lados de la arista. Cuando desea terminar un proceso manda por todas sus aristas entrantes tantas señales como indica el valor ``déficit'' disminuendo así el campo. Un proceso puede terminar cuando desea terminar y todos sus aristas salientes tengan déficit cero.
El algoritmo de Dijkstra-Scholten desarrollado hasta ahora obviamente no funciona para grafos que contienen cíclos. Sin embargo, se puede usar el siguiente truco:
Siempre cuando un proceso es iniciado por primera vez, el correspondiente mensaje causa una arista nueva en el grafo que es la primera que conecta a dicho proceso. Si marcamos estas aristas especialmente, se observa que forman un árbol abarcador (``spanning tree'') del grafo.
El algoritmo de determinación de terminación procede entonces como sigue: