Wenn dein Probblem das Beenden von Tasks/Prozessen ist, dann mal folgender Vorschlag.
Bei mir kommt jeder beendeter Thread einfach in eine Liste, die wiederrum den Thread-Killer aktiviert (ist nen Kernel-Thread) und erst dieser räumt alles für den Thread auf, was der nicht machen konnte (z.B. den Stack), dann wird geguckt ob es der letzte Thread des Tasks ist, ist dass der Fall wird der komplette Task gelöscht.
Damit jetzt nicht ein neuer Thread erstellt werden kann, obwohl der Task eigentlich schon beendet sein soll, wird der Task (das gleiche gilt für jeden Thread der beendet werden soll) aus der Task-Liste genommen, um nicht mehr erreichbar zu sein und der Status wird auf _KILLED gesetzt.
Sowas ähnliches (ein Status-Bit) zusammen mit Hazard-Pointern (die sollten besser, einfacher und schneller sein, als Reference-Counting bzw. gab es beim Reference-Counting auch irgendein Problem, welches zwar selten auftritt, aber es tritt auf und deswegen will ich das auf keinen Fall nutzen) könnte eine Lösung sein, wenn du alles mögliche parallelisieren willst und auch Pointer in einem Cache behalten willst.
Ansonsten sollte man sich immer überlegen, ob die Parallelisierung, besonders mit den ganzen Problemen die da mit kommen, besser und schneller ist, als einfach nur ein oder ein paar vernünftige Locks.
Edit::
Ich glaube ich habe da nen Denkfehler bezüglich der Hazard-Pointers, oder? Es wird doch bei jedem "freigeben" eines Pointers überprüft ob schon eine gewisse Anzahl von Pointern in der Liste (per Thread) sind und dann werden die Pointer eventuell freigegeben (wenn kein anderer Thread mehr auf den Pointer zugreift). Sprich man muss kein Flag setzen, sondern das Problem löst sich irgendwann von selbst, oder?