Funktion unterbrechen/fortsetzen
-
hi
ich habe n funktionen. in einigen dieser funktionen gibt es schleifen und es wird darin, sagen wir die funktion "jump()" augeführt.
jetzt möchte ich beim aufruf von jump die funktion verlassen (um mich der nächsten zuzuwenden). nach dem durchlauf aller funktionen werden sie erneut ausgeführt (die die vorzeitig mittels jump verlassen wurden). dabei soll (beim erneuten eintreten in die funktion), an genau der stelle weitergemacht werden wo unterbrochen wurdewie kann man das machen?
ich weiß, dass man die funktionen theoretisch in separaten threads ablaufen lassen könnte. dann könnte man mit wait() anhalten und nach nem notifyall() weiter machen. allerdings kann n relativ groß werden (um die 100 bis 1000 sind möglich). macht es da sinn für jede funktion einen einzelnen thread zu starten? der kommunikationsaufwand wäre doch enorm oder?
-
Was du willst ist ohne Threads nicht möglich.
Das Problem ist dass beim 'jump' der Zustand der Funktion gespeichert werden muss, dazu gehören vor allem die aktuelle Programmposition und der Stack.
Genau aus diesem Grund hat jeder Thread seinen eigenen Stack und das OS übernimmt für dich das Sichern und Wiederherstellen des Zustands.
Theoretisch könntest du sowas selbst zusammenbasteln aber das wäre
1. Ziemlich kompliziert
2. Nur mit "Dirty Tricks" wie label und goto zu erreichen.Du brauchst für jede Funktion die "unterbrochen" werden soll einen Thread. Wenn du also weißt dass maximal 10 Funktionen zur selben Zeit unterbrochen werden können würden dir 11 Threads reichen.
Ich würde aus deiner Fragestellung aber eher ableiten dass du ein ganz gravierendes Designproblem hast, erklär uns doch mal was du genau machen willst, bin mir ziemlich sicher dass es dafür eine bessere Lösung gibt: Threadpools Futures, Ansätze wie QtConcurrent
-
Sowas lässt sich eigentlich nur mit Coroutinen realisieren. Die gibt es aber in C++ so erstmal nicht. Bei
boost.asioist allerdings seit Version 1.42.0 ein Beispiel (HTTP Server 4) dabei, wie man Coroutinen recht einfach und vor allem flexibel in C++ abbilden kann.
Man kann sowas auch mit Funktionsobjekten abbacken, jedoch entsteht dabei eine Menge Boilerplate Code, wenn man viele Coroutinen hat.