Forum: PC-Programmierung Grundsätzliches zu Threads (gcc/linux/SDL)


von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Hi,

momentan weiss ich nicht mehr ganz so weiter. Mein Programm klemmt von 
vorn bis hinten, obwohl ich kaum Rechenleistung dafür bräuchte.
Nun bin ich schon eine ganze Weile dran und werde das jetzt mit Threads 
lösen.

Das Programm ist in C geschrieben, verwendet SDL und daher verwende ich 
auch die SDL Threads lib, da mir mit den pthreads alleine immer SDL 
abschmiert und meckert irgendwas von wegen XinitThreads. Mit der SDL Lib 
hab ich soweit keine Probelem.

Nun ergeben sich da ein paar Fragen...

Was ist eleganter/sinnvoller?
Entweder starte ich von z.B. main() aus zwei Threads. Der eine übernimmt 
die Hauptaufgaben, der andere updated mir die Ausgabe, wenn sich was 
ändert.
ODER erstelle ich nur einen Thread und lasse das Hauptprogramm 
weitermachen?
1
main() {
2
   start_thread1();  // main program
3
   start_thread2();  // screeen update
4
   for(;;) { wait_until_both_finished(); }
5
   exit();
6
}
7
8
ODER
9
10
main() {
11
   start_screen_updater_thread();
12
   for(;;) {
13
       // main program code here
14
   }
15
   exit();
16
}
Die erste Möglichkeit "hinterlässt" ja eine Endlosschleife, die 
dauerhaft Rechenleistung braucht um zu sehen, ob die Threads zu Ende 
sind.
Die Zweite Möglichkeit nutzt eben diese Schleife um die Hauptaufgaben zu 
erledigen.
Ich denke mal, da dies einmal Thread-Switchen spart, spare ich mir damit 
Rechenleistung, oder?


Das nächste:
Für die "Kommunikation" zwischen Threads,  wann wer zu warten hat, gibt 
es Mutexe.
Ist es aus Speicher/Speed-Gründen nicht sinnvoller einfach nur eine 
globale Variable zu nehmen? Speicher und Speed hab ich nicht allzuviel, 
da das Programm auf einer embedded Plattform laufen wird (64M RAM, ~2MB 
Flash frei).
1
int waitflag;
2
3
main() {
4
   for(;;) {
5
      do_something_on_the_screenbuffer();
6
      waitflag = 1;
7
   }
8
}
9
10
updater() {
11
   for(;;) {
12
      while(!waitflag);  // wait for waitflag to be 1
13
      copy_screenbuffer_to_screen();
14
      waitflag = 0;
15
   }
16
}
Oder sollte ich dabei einfach ganz auf das Warten auf ein Ereignis 
verzichten und den screen nach einer bestimmten Zeit neu aufbauen (z.B. 
50 mal pro Sekunde)?

Dann noch:
WIE warte ich in einem Thread? eine for(...;...;...) { asm("nop"); } 
oder while(!ereignis); oder einfach nur mit delay-Funktionen der 
jeweiligen Libs.
Ich möchte natürlich während dem warten keine Rechenleistung an den 
wartenden Thread verschwenden und "Stillstand" gibt es für eine CPU ja 
nicht, erst recht nicht für Pseudo-Multitasking-Sachen wie Threads.


Ich hoffe, dass mir jemand von euch das etwas genauer erklären kann.

von Sven P. (Gast)


Lesenswert?

Ich vermute, du läufst in eine ganz typische Falle.

Hast du in deinem Programm überhaupt irgendetwas, was parallel laufen 
muss? Oder täte es nicht etwa ein Zustandsautomat?

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Bisher wars der Zustandsautomat.

Es ist ja auch nicht so, dass es mit den Threads schon hängt. Ich bin ja 
gerade noch dabei, das ganze so zu planen, dass es mit den Threads 
läuft.
Momentan häng ich dran, die ganzen Funktionen Thread-Safe zu machen.

Ich möchte nur gern wissen, was mir die Performance zusammenschlägt, 
eben zum "Design" von Programmen mit Threads.

An den Threads komme ich höchstwahrscheinlich nicht mehr vorbei. Das 
Programm hat Video Ausgabe/Tastatur Eingabe, greift auch Chips am SPI 
und I2C Bus zu, simuliert mehrere IO-Bausteine und es läuft eine Shell 
drauf, die zur Laufzeit um "Binär-Packages" erweitert werden muss (bzw. 
müssen nicht unbedingt, muss aber möglich sein). Die Binär-Packages 
müssen dann auch noch von einem 8085 CPU Simulator abgearbeitet werden. 
Diese Maschinencodes sind die Programme aus ca. 250 EPROMs die noch zur 
originalen Steuerung hier rumliegen.

Soweit tut ja alles, aber es klemmt extrem an der Ausführung...

Das Teil stellt den Nachbau einer Steuerung für LED-Matrixen aus 
Waschstrassen dar, mit der aber statt nur einer wie im Original, bis zu 
8 von den Dingern gesteuert werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.