How to Multithreading in C? (Gelöst)
-
moin!
Das erste ist mir hoffentlich klar: Threads sind Programme in Programmen (Unterprogramme), die parallel zu einander ablaufen können. Normalerweiße wird Befehl für Befehl abgearbeitet, bei Threads jedoch wird sozusagen bei jedem einzelnen Befehl hin und her "geswitcht", so dass man denkt, dass es Gleichzeitig abläuft =>"Pseudomultitasking". Oder
So, nun zu der Verwendung von Threads. Das ist ein Programmierbeispiel von der Seite http://www.c-programmieren.com/C-Lernen.html
#include <stdio.h> #include <stdlib.h> #include <windows.h> DWORD WINAPI Thread() { while(1) { Sleep(1); printf("Ich bin der Thread!\n"); } return 0; } int main(int argc, char *argv[]) { CreateThread(NULL, 0, Thread, NULL, 0, NULL); while(1) { Sleep(1); printf("Hallo, ich bin das Hauptprogramm!\n"); } return 0; }
Fragen dazu:
1. Warum kann man nicht einfach int statt DWORD verwenden?
2. Warum heißt es DWORD, wenn dieser Datentyp nur Zahlenwerte speichern kann und nicht DDIGIT oder DNUM irwas herleitbares eben.
3. Warum muss bei der Funktionsdeklaration, das Schlüsselwort WINAPI stehen?
4. Kann man Threads werte übergeben, die sie dann wieder zurückliefern (ohne Funktionen)?
5. Welche Datentypen gibt es noch außer DWORD, WORD...
6. Das ist also die Threaddeklaration:CreateThread(NULL, 0, Thread, NULL, 0, NULL);
Oder
7. Dieses Example lässt sich nicht kompilieren, es folgt ne Fehlermeldung, why?Unreachable code
Cannot convert'unsigned long(__stdcall*)() to unsigned long(__stdcall*)(void*)
Type missmatch in parameter8. Wie lässt sich ein Thread von Hand beenden im Sinne von break; und continue;?
Gruß
agi
-
ANSI C kennt keine Threads. Das ist das falsche Forum.
-
1. Warum kann man nicht einfach int statt DWORD verwenden?
-> DWORD ist vom Typ unsigned long
2. Warum heißt es DWORD, wenn dieser Datentyp nur Zahlenwerte speichern kann und nicht DDIGIT oder DNUM irwas herleitbares eben .
-> Es gibt in der Maschinensprache keine der o.g. Typen, sondern nur
BYTE, WORD, DWORD, QWORD. D steht hier für Double und Q für Quad.3. Warum muss bei der Funktionsdeklaration, das Schlüsselwort WINAPI stehen?
-> In der Funktion zum Erstellen des Threads werden eventuell Sachen durchgeführt die diesen Funktionstyp benötigen, sicher bin ich mir allerdings hier nicht.
4. Kann man Threads werte übergeben, die sie dann wieder zurückliefern (ohne Funktionen)?
-> Das kannst du per Casten erledigen, denn wie du siehst kannst du einen void-Zeiger übergeben, den du in alles umcasten kannst.
5. Welche Datentypen gibt es noch außer DWORD, WORD...
-> Siehe Nr. 2
6. Das ist also die Threaddeklaration..
-> Nein, das ist ein Funktionsaufruf.
-
aXYZn schrieb:
7. Dieses Example lässt sich nicht kompilieren, es folgt ne Fehlermeldung, why?
Unreachable code
Cannot convert'unsigned long(__stdcall*)() to unsigned long(__stdcall*)(void*)
Type missmatch in parameterWeil:
"... lpStartAddressThe starting address of the new thread. This is typically the address of a function declared with the WINAPI calling convention that accepts a single 32-bit pointer as an argument and returns a 32-bit exit code. Its prototype is:
DWORD WINAPI ThreadFunc( LPVOID ); ..."
-
Multithreading Experiment:
#include <stdio.h> #include <windows.h> DWORD WINAPI TestThread(LPVOID); // Prototyp int main() { CreateThread(0,0,TestThread,0,0,0); // Threadaufruf for(;;) { if(GetAsyncKeyState(38)&1) // PFEILTASTE OBEN printf("bla"); } system("PAUSE"); return 0; } DWORD WINAPI TestThread() { for(;;) { if(GetAsyncKeyState(37)&1) // PFEILTASTE LINKS printf("\a"); } return 0; }
Dankeschön!
Gruß
agi
-
Der Vollständigkeit zu liebe:
WINAPI legt die Calling Convention fest.
-
Der neugier zu liebe
:
Was is ne Calling convention (laut Google irwas mit Assembler)?
Gruß
agi
-
aXYZn schrieb:
Was is ne Calling convention (laut Google irwas mit Assembler)?
wenn wir schon bei winapi sind: http://www.cs.cornell.edu/courses/cs412/2001sp/resources/microsoft-calling-conventions.html
-
Leider ist der Link ungültig
-
bei mir geht er.
-
+fricky schrieb:
bei mir geht er.
Hmmm... eventuell war der Server gegen 13 Uhr kurzzeitig down, denn bei mir ging er in dem Zeitraum auch nich...
Grüße
agi