C++ Threads (Windows) - Objektorientiert

Der größte unterschied zwischen der std::thread Klasse und dem Thread aus der WinAPI ist, dass std::thread keine Prioritäten unterstützt. Intern verwendet std::thread allerdings unter Windows die genannte CreateThread Funktion. Es ist daher möglich mit std::thread::native_handle ( http://de.cppreference.com/w/cpp/thread/thread/native_handle ) an das native WinAPI handle zu kommen und dann die Priorität einzustellen.

Beides ist allerdings in moderner Software nicht zu empfehlen. Stattdessen solltest du dir std::async, std::future und std::promise genauer ansehen :)

Viele Grüße
 
Narkry schrieb:
Der größte unterschied zwischen der std::thread Klasse und dem Thread aus der WinAPI ist, dass std::thread keine Prioritäten unterstützt. Intern verwendet std::thread allerdings unter Windows die genannte CreateThread Funktion. Es ist daher möglich mit std::thread::native_handle ( http://de.cppreference.com/w/cpp/thread/thread/native_handle ) an das native WinAPI handle zu kommen und dann die Priorität einzustellen.

Beides ist allerdings in moderner Software nicht zu empfehlen. Stattdessen solltest du dir std::async, std::future und std::promise genauer ansehen :)

Viele Grüße

Was ist denn bitte async future und primise? Die Namen sind recht nichtssagend, oder sind die ausgedacht xD ?
 
Ich würde auch die C++-Standardbibliothek empfehlen. Wenn du aber dennoch CreateThread nutzen möchtest, so ist dein Vorhaben trotzdem machbar. Das 4. an CreateThread() übergebene Argument ist ein void-Pointer. Was immer du der Funktion da übergibst, wird später an deine Thread-Funktion durchgereicht. In deiner Thread-Funktion static_cast'est du den void-Zeiger zurück auf deine Klasse und rufst dann an der Instanz die gewünschte Methode auf.
Ergänzung ()

Tockra schrieb:
Was ist denn bitte async future und primise? Die Namen sind recht nichtssagend, oder sind die ausgedacht xD ?

Wir wär's mit 10 Sekunden Google-Suche?
 
Abstraktionen die es deutlich einfacher machen :) std::async verwaltet für dich die Threads automatisch und verhindert vor allem das zu viele Threads erzeugt werden (oversubscription). Genauso erleichtert es das annehmen von Rückgabewerten und Exception Handling, indem es ein std::future zurück gibt bei dem du, sobald du das Ergebnis der Funktion benötigst, einfach die get() Methode aufrufst. Dadurch bekommst du das Ergebnis der Funktion und evtl. aufgetretene Exceptions. Beides ist mit std::thread nur sehr schwer umsetzbar und oft fehlerhaft implementiert.

http://en.cppreference.com/w/cpp/thread/async
http://en.cppreference.com/w/cpp/thread/future
Für mehr Beispiele und Erklärungen.
 
Narkry schrieb:
Abstraktionen die es deutlich einfacher machen :) std::async verwaltet für dich die Threads automatisch und verhindert vor allem das zu viele Threads erzeugt werden (oversubscription). Genauso erleichtert es das annehmen von Rückgabewerten und Exception Handling, indem es ein std::future zurück gibt bei dem du, sobald du das Ergebnis der Funktion benötigst, einfach die get() Methode aufrufst. Dadurch bekommst du das Ergebnis der Funktion und evtl. aufgetretene Exceptions. Beides ist mit std::thread nur sehr schwer umsetzbar und oft fehlerhaft implementiert.

http://en.cppreference.com/w/cpp/thread/async
http://en.cppreference.com/w/cpp/thread/future
Für mehr Beispiele und Erklärungen.

Danke, wie passt da Promise dann in den Kontext?
 
Der genaue Ablauf wenn man std::async verwendest ist, das aus der übergebenen Funktion/Methode ein std::promise erzeugt wird. Das std::promise erzeugt anschließend das std::future auf dem du get aufrufen kannst z.B. Es gibt Fälle in denen du das promise selbst erzeugen musst/möchtest, z.B. sobald Thread Prioritäten nötig sind. In diesem Fall musst du leider auch das Thread Management selbst übernehmen, dass ansonsten std::async für dich übernimmt.
 
Wahrscheinlich kann man mit der Windows.h mehr machen, aber was ist mit der Standardbib denn möglich?
Eigentlich alles, was man so braucht, inklusive Zugriff auf das darunterliegende, aber Plattform- und ggf. implementierungsabhängige Thread-Handle, sodass man prinzipiell auch Windows-spezifische Funktionen darauf aufrufen kann. Zum Beispiel, um die Thread-Priorität zu ändern.

Das Schöne ist nebenbei auch, dass man direkt Lock-Typen und solche Sachen plattformunabhängig und mit einer für STL-Verhältnisse sehr aufgeräumten API benutzen kann - die dann auch dafür sorgen, dass ein gelocktes Objekt auch immer freigegeben wird und sowas, selbst, wenn einem mal eine Exception um die Ohren fliegt.

Drawback: Man bräuchte dafür eine C++11-kompatible Standardbibliothek, und ich weiß nicht, ob so etwas in der Windows-Welt schon existiert. Da tut man sich schon bei den Compilern schwer...

Beides ist mit std::thread nur sehr schwer umsetzbar und oft fehlerhaft implementiert.
Eigentlich ist das ein klassischer Fall für einen Thread-Pool. In der Hinsicht mag ich die zusätzlichen STL-Funktionen dann doch nicht, weil niemand wirklich weiß, wie es im Endeffekt implementiert ist und man praktisch keinen Einfluss auf die Ausführung und/oder Priorisierung von Jobs nehmen kann. Allerdings dürften die Fälle, wo man so etwas tatsächlich braucht, relativ rar gesät sein.
 
Wenn der Extrathread nur da ist, weil dein Socket blockiert, bietet Windows auch asynchrone Sockets.
 
VikingGe schrieb:
Drawback: Man bräuchte dafür eine C++11-kompatible Standardbibliothek, und ich weiß nicht, ob so etwas in der Windows-Welt schon existiert. Da tut man sich schon bei den Compilern schwer...
MS ist zwar lahm, ändert nicht so lahm. Std::thread und co werden mindestens seit VS2012 unterstützt und mingw sollte das eigentlich auch schon lange supporten. Allerdings ist selbst VS2015 noch nicht ganz c++11/14 konform und wird es wohl auch nicht.

@ Tockra: Du willst mir ernsthaft sagen, dass du bei der Suche nach c++ und threads keine brauchbaren Tutorials gefunden hast?

Für den Einstieg in Multi-Threaded-Programming würde ich übrigens eher QT empfehlen. Die Standarbibliothek ist in dem Bereich einfach viel zu primitiv.
 
Zurück
Oben