Funktionen nach Priorität ausführen



  • Frage:

    Starte mehrere Funktionen in verschiedenen Threads unter Windows zur gleichen Zeit. Jeder Funktion gebe ich eine Nummer als Prio mit (1=hoch,...,10=niedrig).

    Nun möchte ich das nur die höchstpriore als erstes komplett durchläuft, dann die nächste. es sollen also alle blockiert werden, also warten.

    Habt ihr nen Vorschlag wie ich sowas angehen soll.



  • Wozu überhaupt mehrere Threads, wenn du dann doch alle Funktionen sequenziell abarbeiten lassen willst?



  • zum Schluss sollen es sogar einzelne Prozesse sein, die zu beliebigem Zeitpunkt gestartet werden. Dann soll aber nur der höchstpriore seine Arbeit machen.

    Sequenziell geht nicht weil diese Prozesse zufällig gestartet werden. (Also man weis am Anfang nicht welcher wann und ob überhaupt)



  • JDHawk schrieb:

    ...
    Sequenziell geht nicht weil diese Prozesse zufällig gestartet werden. (Also man weis am Anfang nicht welcher wann und ob überhaupt)

    Sorry, aber das Eine hat mit dem Anderen doch überhaupt nichts zu tun. "Sequentiell" ist einfach nur das Gegenteil von "parallel".
    Hier ist z.B. die Reihenfolge auch nicht im Programm festgelegt und trotzdem ist es ein astrein sequentielles Programm:

    int main() {
       int no = 0;
       while(cin>>in) {
         case 0: f1(): break;
         case 1: f2(): break;
         case 2: f3(): break;
         default: f4();
       }
       return 0;
    }
    

    ... statt von cin kannst Du natürlich auch aus einer Priorityqueue lesen.

    Gruß,

    Simon2.



  • Du könntest über SetThreadPriority() steuern, in welcher Rangfolge Windows deine Threads aufruft, aber wirklich sequenziell arbeitet der Scheduler auch nicht. Zur Not müsstest du deinen eigenen Scheduler schreiben, der alle laufenden Threads mit Priorität verwaltet und alle außer dem höchstwertigen mit SuspendThread() auf Eis legt.



  • Vielen Dank für die guten Tips aus der Windows Welt.
    Wollte schon busy waits einbauen und damit den Prozessor unnötig beschäftigen.



  • Bau dir doch noch einen Zusätzlichen Prozess der das Knechten (ausführen der Funktionen) übernimmt, während deine anderen Prozesse einfach nur die auszuführenden Funktionen (bzw. Funktoren) an den Knechtprozess übergeben. Dann wird wirklich alles zentral in einem Thread/Prozess sequentiell abgearbeitet und die Client-Prozesse idlen so lange bis ihr Auftrag zurückkehrt.


Anmelden zum Antworten