Ich bin Neuling in der Prozess- / Aufgabenverwaltung. Ich möchte zwei Aufgaben planen. Angenommen,
%Vor%Also wie plane ich sie, damit ich meine gewünschte Ausgabe bekomme.
Ich möchte, dass es in Code :: Blocks (Windows) läuft. Ich möchte, dass fun1 1 Minute läuft und fun2 alle 2 Minuten läuft. Wenn ich es in zwei getrennten Prozessen auch tun kann, dann sag mir, wie kann ich es tun. Muss ich Semaphore, Mutex und alle benutzen?
Ihr Beispiel ist trivial und kann geplant werden, ohne auf OS-basierte Scheduling- oder sogar OS-Timing-Dienste zurückgreifen zu müssen. Im Allgemeinen (für nicht-triviale Anforderungen) in Windows würden Sie Multithreading verwenden und dem Betriebssystem erlauben Planung. main()
ist bereits ein Thread, Sie müssen also nur einen anderen erstellen. In seiner einfachsten Form:
Siehe Erstellen von Threads für eine vollständigere Behandlung von Threads in Win32. Beachten Sie, dass das .NET-Framework auch eine einfachere klassenbasierte Schnittstelle zum Threading bietet.
Bearbeiten: Dies wird aktualisiert, daher möchte ich eine Erläuterung für die Nachwelt hinzufügen. Dies ist kein guter Weg, um dieses Problem zu lösen - Sie würden nie dies von Hand machen wollen. Kooperative Benutzer-Threads sind nett und können verwendet werden, um clevere Dinge wie Koroutinen zu implementieren, aber wenn Sie das tun möchten, sollten Sie eine Bibliothek wie libcoroutine , die die haarigen Bits für Sie behandelt. Obwohl dies keine praktische Lösung ist, stellt es dennoch eine interessante Idee dar und ist ein interessantes Beispiel für die Planung und die Grenzen des reinen C99.
Das ist eine schlechte Antwort. Es ist jedoch plattformunabhängig und verwendet darüber hinaus nur Funktionen, die im C99-Standard definiert sind.
Auf der anderen Seite, es schwebt die CPU (es gibt keine sleep
Funktionen in C99, also müssen wir warten -), verwendet, was ich nur Magie nennen kann, um Speicherplatz auf dem Stapel zu reservieren, und missbraucht% Code%. Es verwendet sogar globale Variablen! Und doch, es funktioniert.
Die Technik heißt kooperative Benutzer-Threads, auch Fasern genannt. Ich habe es wie erwähnt mit setjmp
und setjmp
implementiert. Der longjmp
erledigt eine einfache Round-Robin-Planung.
Dies ist der Code:
%Vor%Und das ist die Ausgabe, die ich bekomme:
%Vor%Nun, es wäre besser, wenn Sie Ihr Betriebssystem (oder die Anforderung der Kreuzplatformität) angeben könnten
Yo kann schreiben:
Für das Multitasking kann jeder von oben verwenden:
Beispiel. POSIX-kompatibles Betriebssystem (wie Linux), Prozesse verwenden
%Vor%Andere Fälle:
Im Folgenden werden zwei Threads erstellt. Thread # 1 druckt einmal pro Minute und Thread # 2 druckt einmal in 2 Minuten. Diese Threads werden vom Scheduler Ihres Betriebssystems geplant. In Linux haben wir cfs , um die Planung durchzuführen. Und um einen Überblick über die Planung zu erhalten, lesen Sie dies
%Vor%Ausgabe:
%Vor%Hoffe, das hilft!
Dieser Ansatz erfolgt über die Operationen setjmp und longjmp mit dem Befehl sleep.
%Vor%Tags und Links c windows embedded scheduled-tasks operating-system