Kann jemand ein einfaches Beispiel für das Starten von zwei (objektorientierten) Threads in C ++ veröffentlichen?
Ich suche nach tatsächlichen C ++ - Thread-Objekten, auf die ich Ausführungsmethoden (oder ähnliches) erweitern kann, anstatt eine Thread-Bibliothek im C-Stil aufzurufen.
Ich habe alle betriebssystemspezifischen Anfragen ausgelassen, in der Hoffnung, dass jeder, der geantwortet hat, mit plattformübergreifenden Bibliotheken antworten würde. Ich mache das jetzt nur explizit.
c++
multithreading
Zak
quelle
quelle
Antworten:
Erstellen Sie eine Funktion, die der Thread ausführen soll, z.
Erstellen Sie nun das
thread
Objekt, das letztendlich die obige Funktion aufruft, wie folgt:(Sie müssen auf
#include <thread>
diestd::thread
Klasse zugreifen )Die Argumente des Konstruktors sind die Funktion, die der Thread ausführen wird, gefolgt von den Parametern der Funktion. Der Thread wird beim Aufbau automatisch gestartet.
Wenn Sie später warten möchten, bis der Thread die Funktion ausgeführt hat, rufen Sie Folgendes auf:
(Beitritt bedeutet, dass der Thread, der den neuen Thread aufgerufen hat, darauf wartet, dass der neue Thread die Ausführung beendet, bevor er seine eigene Ausführung fortsetzt.)
Der Code
Weitere Informationen zu std :: thread finden Sie hier
-std=c++0x -pthread
.quelle
-std=c++0x
(anstelle von-std=c++0x
)". Ich glaube, das zweite "c ++ 0x" sollte stattdessen "c ++ 11" sein, aber das kann nicht geändert werden, da die Bearbeitung zu klein ist.task1
. Der Funktionszeiger wird also auch mit bezeichnettask1
. Aber danke, dass Sie dies angesprochen haben, denn ich glaube, ich habe mich geirrt und es ist gleichbedeutend&task1
damit. Es spielt also keine Rolle, welche Form Sie schreiben (wenn ja, denke ich, dass Zeiger auf Zeiger der Funktion ist&&task1
- das wäre schlecht ). Relevante Frage .Technisch gesehen wird ein solches Objekt über eine Thread-Bibliothek im C-Stil erstellt, da C ++
std::thread
in c ++ 0x nur ein Aktienmodell angegeben hat, das gerade festgenagelt und noch nicht implementiert wurde. Das Problem ist etwas systematisch. Technisch gesehen ist das vorhandene C ++ - Speichermodell nicht streng genug, um eine genau definierte Semantik für alle Fälle zu ermöglichen, die vorher auftreten. Hans Boehm hat vor einiger Zeit einen Artikel zu diesem Thema geschrieben und war maßgeblich daran beteiligt, den c ++ 0x-Standard zu diesem Thema auszuarbeiten.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Es gibt jedoch mehrere plattformübergreifende Thread-C ++ - Bibliotheken, die in der Praxis einwandfrei funktionieren. Intel-Thread-Bausteine enthalten ein tbb :: thread-Objekt, das dem c ++ 0x-Standard sehr nahe kommt, und Boost verfügt über eine boost :: thread-Bibliothek, die dasselbe tut.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Mit boost :: thread erhalten Sie Folgendes:
quelle
Es gibt auch eine POSIX-Bibliothek für POSIX-Betriebssysteme. Überprüfen Sie die Kompatibilität
Kompilieren Sie mit -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
quelle
quelle
Bei der Suche nach einem Beispiel für eine C ++ - Klasse, die eine ihrer eigenen Instanzmethoden in einem neuen Thread aufruft, wird diese Frage gestellt, aber wir konnten keine dieser Antworten auf diese Weise verwenden. Hier ist ein Beispiel dafür:
Class.h
Class.cpp
Beachten Sie, dass dieses Beispiel nicht in Mutex oder Sperren gerät.
quelle
Sofern keine separate Funktion in globalen Namespacs gewünscht wird, können Lambda-Funktionen zum Erstellen von Threads verwendet werden.
Einer der Hauptvorteile beim Erstellen von Threads mit Lambda besteht darin, dass wir keine lokalen Parameter als Argumentliste übergeben müssen. Wir können die Erfassungsliste für dasselbe verwenden und die Schließungseigenschaft von Lambda kümmert sich um den Lebenszyklus.
Hier ist ein Beispielcode
Bei weitem habe ich festgestellt, dass C ++ - Lambdas die beste Methode zum Erstellen von Threads sind, insbesondere für einfachere Threadfunktionen
quelle
Dies hängt weitgehend von der Bibliothek ab, für die Sie sich entscheiden. Wenn Sie beispielsweise die Bibliothek wxWidgets verwenden, sieht die Erstellung eines Threads folgendermaßen aus:
Wenn Ihr Hauptthread die CreateThread-Methode aufruft, erstellen Sie einen neuen Thread, der den Code in Ihrer "Entry" -Methode ausführt. In den meisten Fällen müssen Sie einen Verweis auf den Thread behalten, um ihn zu verbinden oder zu stoppen. Weitere Infos hier: wxThread-Dokumentation
quelle