Wie plane ich zwei Aufgaben?

8

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?

    
Rasmi Ranjan Nayak 11.01.2012, 07:59
quelle

7 Antworten

3

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:

%Vor%

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.

    
Clifford 11.01.2012, 11:40
quelle
15

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%     
cha0site 11.01.2012 09:36
quelle
3

Nun, es wäre besser, wenn Sie Ihr Betriebssystem (oder die Anforderung der Kreuzplatformität) angeben könnten

Yo kann schreiben:

  • Betriebssystemabhängiger Code
  • plattformübergreifender Code (für mehrere Betriebssysteme)

Für das Multitasking kann jeder von oben verwenden:

  • Threads oder
  • Prozesse
  • Timer

Beispiel. POSIX-kompatibles Betriebssystem (wie Linux), Prozesse verwenden

%Vor%

Andere Fälle:

  • POSIX (Linux / UNIX) + -Threads: Verwenden Sie die Funktion pthread_create, um Threads
  • zu erstellen
  • Windows + threads / processes: Verwenden Sie die Funktion CreateThread () oder CreateProcess ()
  • Crossplatform: Verwenden Sie spezielle High-Level-Bibliotheken wie GLIB, um Threads / Prozesse zu erstellen
LiMar 11.01.2012 08:24
quelle
2

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!

    
Sangeeth Saravanaraj 11.01.2012 08:20
quelle
1

Der einfachste, aber nicht genaue Weg ist die Verwendung der POSIX sleep() -Funktion innerhalb einer Endlosschleife.

%Vor%

Wenn Sie komplexere Aufgaben ausführen müssen, sind Sie möglicherweise an POSIX-Threads und POSIX-Timer interessiert.

    
mouviciel 11.01.2012 08:26
quelle
1

Dieser Ansatz erfolgt über die Operationen setjmp und longjmp mit dem Befehl sleep.

%Vor%     
Barun Parichha 10.02.2012 10:02
quelle
0

Ich denke, Sie sollten einen Scheduling-Algorithmus wie Round-Robin verwenden oder einen eigenen Algorithmus erstellen.
Hier finden Sie einige Algorithmen Ссылка < Sie finden Beispiele, wie sie implementiert werden und welche Sie verwenden können.

    
Coder 11.01.2012 08:08
quelle