Das Primitiv was du suchst, ist ein
Mutex (zB. CriticalSection unter Windows) und eine
Condition-Variable. Der
Mutex schützt den Zähler (und eventuell andere Datenstrukturen), auf der Condition-Variable kannst du schlafen. Das ist die Standard-Lösung für solche Probleme. So etwas mit Sleep oder Ähnlichem zu implementieren ist Frickelei (Sorry Medium
).
Darauf aufbauend kannst du Warteschlangen implementieren. Dabei schläft der Thread so lange, bis er das nächste Element aus der Warteschlange nehmen kann. Auch so etwas sollte es in Threading-Bibliotheken fertig geben ... da kenne ich mich unter Delphi aber nicht aus.
Nur wenn die Synchronisation ein Flaschenhals ist, muss man nach anderen Lösungen suchen, z.B. nicht-blockierende Algorithmen.