Man muss die Teilstücke ja auch nicht starr einem Thread zuordnen, sondern kann einen Worker-Pool nutzen. Der enhält so viele Worker, wie es Prozessoren gibt.
Zu den Teilbereiche werden die angrenzenden Punkte mitgespeichert (sog. Geisterpunkte). Es sollte mehr Teilstücke geben als Worker.
Der Hauptthread macht nun folgendes:
- die Teilstücke initialisieren
- alle Teilstücke in Auftrag geben
- blockieren, bis alle Teilstücke berechnet wurden
- die Geisterpunkte aktualisieren
- Abbruchkriterium prüfen, wenn nicht erfüllt: gehe zu 2.
Ein schöner Nebeneffekt ist, dass du nach Schritt 4. auch mal einen Zwischenstand speichern kannst.
Eine andere Sache: Wenn du weder Synchronisationsmittel nutzt, noch dich selbst darum kümmerst, können "merkwürdige" Sachen mit den Caches passieren. In den meisten Varianten sollte die Implementierung des Workerpool mit klassischen Synchronisationsmitteln schon ausreichen, um solche Effekte zu vermeiden.