Asumimos el siguiente modelo de 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 rara considerando los muchos problemas que se pueden solucionar con estrategias tipo divide-y-vencerás.
La detección de la 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 de 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 se desea terminar un proceso, se envían 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 y 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: