Forum: PC-Programmierung Multithreading C/C++ Win32


von A. R. (redegle)


Lesenswert?

Hallo,

ich würde mich gerne in die Thematik des Multithreadings einarbeiten. 
Nur stehe ich gerade vor dem Problem, dass ich gar nicht weiß wie ich 
anfangen soll.

Ich habe z.B. das Buch "C von A bis Z" zu Hause. Dort wird das Thema 
unter dem Kapitel "Paralleles Rechnen" sehr kurz angeschnitt. Am Anfang 
steht, dass das Buch die POSIX-Threads-Biblothek behandelt und somit 
auch unter Windows verwendbar ist.

Für nähere Informationen verweißt dieses Buch auf das Buch 
"Linux-UNIX-Programmierung" Kapitel 10. Dort wird die pthread-Library 
verwendet. Am Anfang steht jedoch.

...............
Die Beispiele im Buch verwenden Linux-Threads und sind somit nicht ohne 
weiteres auf anderen
UNIXen lauffähig. Die BSD-Threads z. B. arbeiten zum Teil ähnlich. Es 
kann aber sein, dass das eine
Programm läuft und ein anderes nicht und daher auf die Linux-Threads 
verlinkt werden muss. Voraussetzung
sind also Linux-Threads.
.............

Im Internet habe ich nun recherchiert, dass es die POSIX Threads auch 
unter win32 verwendet werden können. Scheinbar gibt es jedoch auch eine 
extra Library für Windows.

Kann mir jemand erklären, welche Bibliothek ich am sinnvollsten 
verwenden kann, welche Vorteile das hat und wo ich mich einlesen kann.

von Ingo W. (Gast)


Lesenswert?

Um innerhalb deines Programms neue Threads anzuschubsen, brauchst Du 
keine Bibliotheken, dafür gibt es normale API-Funktionen, z.B.
http://msdn.microsoft.com/en-us/library/ms682453%28v=vs.85%29.aspx
Für Win wird dann wohl auch das MSDN die günstigste Quelle an 
Informationen sein.
Hoffe damit ein Wenig geholfen zu haben,
mfG ingo

von Hans M. (hansilein)


Lesenswert?

Kommt drauf an was Du machen willst.
Willst Du nicht nur auf einem Rechner sondern auch auf vielen Aufgaben 
verteilen können könnte MPI interesant sein, am einfachsten ist meiner 
Meinung nach openMP, da kann man z.B. eine Schleife einfach als parallel 
deklarieren, der compiler msacht den Rest.

http://en.wikipedia.org/wiki/OpenMP

Lies auch diesen Artikel:
http://en.wikipedia.org/wiki/Parallel_programming_model

von Sven P. (Gast)


Lesenswert?

A. R. schrieb:
> ich würde mich gerne in die Thematik des Multithreadings einarbeiten.
> Nur stehe ich gerade vor dem Problem, dass ich gar nicht weiß wie ich
> anfangen soll.
Nun, der erste Schritt ist die Analyse. Stelle fest, ob du überhaupt 
Multithreading benötigst; erfahrungsgemäß kommt man dabei in der 
Mehrzahl der Fälle zum Resultat nein.
Klingt jetzt blöde, aber Multithreading ist tatsächlich oft der falsche 
Weg. Du merkst das bei der Umsetzung spätestens daran, dass du mehr Zeit 
damit verbringst, Threads um Ressourcen gegenseitig auszusperren 
(Mutexen, Semaphore und so weiter), als Algorithmen zu programmieren...


> Ich habe z.B. das Buch "C von A bis Z" zu Hause.
Tu das weg, das taugt wenig.


> Dort wird das Thema
> unter dem Kapitel "Paralleles Rechnen" sehr kurz angeschnitt. Am Anfang
> steht, dass das Buch die POSIX-Threads-Biblothek behandelt und somit
> auch unter Windows verwendbar ist.
Ja, die ist -- wie der Name schon sagt -- portabel. Die meisten 
Betriebssysteme halten sich neuerlich an POSIX. Multithreading in dieser 
Form ist unter UNIX aber eigentlich untypisch, in der Regel erledigt man 
das durch Multiprocessing in Form von Forks. Aber POSIX hat sich dann 
auch etabliert, außer unter Windows, natürlich.

Windows bietet eine ganze Reihe von Routinen zum Multithreading an, mal 
mehr, mal weniger chaotisch. Die MSDN gibt dir da sicherlich Auskunft, 
viel Spaß beim wilden Casting :-)

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Die MSDN gibt dir da sicherlich Auskunft,
> viel Spaß beim wilden Casting :-)

zeigt mir doch mal bitte eine funktion die mit Threading zu tun hat, wo 
man casten muss?

von A. R. (redegle)


Lesenswert?

Ingo Wendler schrieb:
> Um innerhalb deines Programms neue Threads anzuschubsen, brauchst Du
> keine Bibliotheken, dafür gibt es normale API-Funktionen, z.B.
> http://msdn.microsoft.com/en-us/library/ms682453%28v=vs.85%29.aspx
> Für Win wird dann wohl auch das MSDN die günstigste Quelle an
> Informationen sein.
> Hoffe damit ein Wenig geholfen zu haben,
> mfG ingo

Danke, hast schonmal geholfen.
Finde msdn relativ unübersichtlich. Der Link war also schonmal eine 
große Hilfe. Konnte auch ein kleines Tutorian finden 
http://www.spieleprogrammierer.de/index.php?page=Thread&threadID=6661 .

@Hans Mayer,

das werde ich mir dem nächst durchlesen. Ersteinmal reicht jedoch 
mehrere Threads auf einem Rechner zu haben. Klingt aber sehr 
interessant.

@Sven P.,

es geht um das Vorhaben aus diesem Link 
Beitrag "Screen Scraping C/C++"
Ich rufe eine Funktion der curl-Bibliothek auf die eine nicht bekannte 
Anzahl Daten von einem Server empfängt (Verbindung A). Deswegen ist 
diese Funktion für eine unbekannte Zeit aktiv (Programm ist blockiert). 
Ich muss aber gleichzeitige weitere Verbindungen mit dem Server aufbauen 
um diesem mitzuteilen, welche Daten er über Verbindung A senden soll. 
Deswegen würde ich mich gerne mit Threadanwendung beschäftigen.

>> Ich habe z.B. das Buch "C von A bis Z" zu Hause.
>Tu das weg, das taugt wenig.

Das Buch hat mir bis jetzt schon ganz gut geholfen. Aber 
selbstverständlich bin ich für weitere Literaturvorschläge offen.


>Die MSDN gibt dir da sicherlich Auskunft, viel Spaß beim wilden Casting :-)

Danke

von Sven P. (Gast)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Die MSDN gibt dir da sicherlich Auskunft,
>> viel Spaß beim wilden Casting :-)
>
> zeigt mir doch mal bitte eine funktion die mit Threading zu tun hat, wo
> man casten muss?
Beim MPI, PostThreadMessage, Blanko-Parameter lParam und wParam.

von g457 (Gast)


Lesenswert?

> Aber selbstverständlich bin ich für weitere Literaturvorschläge offen.

Vieleicht nicht Literatur aber doch ein gut gemeinter Rat: Geh weg von 
C, z.B. nach C++ (mit Boost) oder Java (bringt alles mit). In beiden 
Fällen ist Mulithreading ∗wesentlich∗ einfacher als die native 
Win-Thread-Schnittstelle.

HTH

von Sven P. (Gast)


Lesenswert?

A. R. schrieb:
> @Sven P.,
>
> es geht um das Vorhaben aus diesem Link
> Beitrag "Screen Scraping C/C++"
> [...]
Ebendas wäre eigentlich ein typisches Beispiel gegen Threads. Aber 
leider ist die libcurl da tatsächlich nicht so ganz flexibel.

Du hast ja ohnehin Puffer im TCP-Stack, von daher würde man sowas 
eigentlich elegant mit select() lösen. Dein Kernproblem ist ja nicht, 
etwas tatsächlich zu parallelisieren. Dein Kernproblem ist, dass du 
keinen Zustandsautomaten konstruieren kannst, woran die libcurl nicht 
ganz unschuldig ist.

Du hast ja effektiv nichts, was man sinnvoll auf mehrere Prozessoren 
verteilen könnte, weil es so rechenaufwändig ist. Du weißt nur einfach 
nicht genau, wie es dem zweiten Programmpfad ergeht. Und ich verspreche 
dir, du wirst früher oder später mit Mutexen herumkleckern, um den 
anderen Thread unter Kontrolle zu halten ;-)

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Beim MPI, PostThreadMessage, Blanko-Parameter lParam und wParam.

warum musst du da casten? kannst doch auch WPARAM/LPARAM als Datentype 
für dein Zeiger arbeiten.

von Sven P. (Gast)


Lesenswert?

Peter II schrieb:
> Sven P. schrieb:
>> Beim MPI, PostThreadMessage, Blanko-Parameter lParam und wParam.
>
> warum musst du da casten? kannst doch auch WPARAM/LPARAM als Datentype
> für dein Zeiger arbeiten.

Bitte was? Wenn ich etwas anderes, als ein Word bzw. Long mitgeben 
möchte, muss ich halt casten, egal ob implizit oder nicht. Und das 
treibt man ja da wirklich bis zum Exzess.

von A. R. (redegle)


Lesenswert?

>> Aber selbstverständlich bin ich für weitere Literaturvorschläge offen.

>Vieleicht nicht Literatur aber doch ein gut gemeinter Rat: Geh weg von
>C, z.B. nach C++ (mit Boost) oder Java (bringt alles mit). In beiden
>Fällen ist Mulithreading ∗wesentlich∗ einfacher als die native
>Win-Thread-Schnittstelle.

>HTH

Das wäre vielleicht sogar ganz hilfreich mich mit boost zu beschäftigen. 
Das scheint ja eine Sammlung von Bibliotheken etc. zu sein.

Welche Vorteile hat die Verwendung von <boost/thread.hpp> gegenüber 
Windows.h?

Kann mir vorstellen, das boost/thread.hpp langsamer als Windows.h ist.

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Welche Vorteile hat die Verwendung von <boost/thread.hpp> gegenüber
> Windows.h?

damit bist du Platformunabhängig, könnte also auch unter linux laufen.

> Kann mir vorstellen, das boost/thread.hpp langsamer als Windows.h ist.
nein, der overhead ist minimal sie rufen auch nur die Windows funktionen 
auf.

Aber ich bin selber kein Freund davon, die paar unterschiede zwischen 
Windows und linux bekomm ich selber recht gut in den Griff. Boost ist 
mir zu viel des guten.

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.