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.