Einfaches C ++ - Threading

8

Ich versuche, einen Thread in C ++ (Win32) zu erstellen, um eine einfache Methode auszuführen. Ich bin neu in C ++ -Threading, aber sehr vertraut mit Threading in C #. Hier ist ein Pseudo-Code von dem, was ich versuche zu tun:

%Vor%

Ich möchte RunStuff von MyMethod aufrufen, ohne es zu blockieren. Was wäre die einfachste Art, RunStuff in einem separaten Thread auszuführen?

Bearbeiten: Ich sollte auch erwähnen, dass ich Abhängigkeiten auf ein Minimum beschränken möchte. (Keine MFC ... usw.)

    
Jon Tackabury 27.02.2009, 20:05
quelle

11 Antworten

12
%Vor%     
greyfade 27.02.2009, 20:09
quelle
7

C ++ 11, das mit neueren Compilern wie Visual Studio 2013 verfügbar ist, enthält als Teil der Sprache Threads zusammen mit einigen anderen netten Bits und Stücken wie Lambda.

Die Include-Datei threads stellt die Thread-Klasse bereit, die eine Gruppe von Vorlagen darstellt. Die Thread-Funktionalität befindet sich im Namespace std:: . Einige Thread-Synchronisierungsfunktionen verwenden std::this_thread als Namespace (siehe Warum der Namespace std :: this_thread? für ein bisschen Erklärung).

Das folgende Konsolenanwendungsbeispiel mit Visual Studio 2013 demonstriert einige der Thread-Funktionen von C ++ 11 einschließlich der Verwendung eines Lambda (siehe Was ist ein Lambda-Ausdruck in C ++ 11? ). Beachten Sie, dass die für Thread-Sleep verwendeten Funktionen wie std::this_thread::sleep_for() die Dauer von std::chrono verwenden.

%Vor%     
Richard Chambers 01.10.2015 02:39
quelle
4

CreateThread (Win32) und AfxBeginThread (MFC) sind zwei Möglichkeiten, dies zu tun.

Wie auch immer, Ihre MyMethod-Signatur müsste sich etwas ändern.

Bearbeiten: Wie in den Kommentaren und von anderen Befragten erwähnt, kann CreateThread schlecht sein.

_beginthread und _beginthreadex sind die C-Laufzeitbibliotheksfunktionen und entsprechen den Dokumenten entsprechend System :: Threading :: Thread :: Start

    
crashmstr 27.02.2009 20:11
quelle
3

Erwägen Sie die Verwendung des Win32-Thread-Pools, anstatt neue Threads für Arbeitsaufgaben zu erstellen. Das Heranziehen neuer Threads ist verschwenderisch - jeder Thread erhält standardmäßig 1 MB reservierten Adressraum für seinen Stack, führt den Thread-Startup-Code des Systems aus, veranlasst, dass Benachrichtigungen an fast jede DLL in Ihrem Prozess übermittelt werden, und erstellt ein anderes Kernel-Objekt. Thread-Pools ermöglichen es Ihnen, Threads für Hintergrundaufgaben schnell und effizient wiederzuverwenden. Je nach Anzahl der von Ihnen übergebenen Aufgaben werden sie größer oder kleiner. Im Allgemeinen sollten Sie spezielle Threads für nie endende Hintergrundaufgaben erstellen und den Threadpool für alles andere verwenden.

Vor Vista können Sie QueueUserWorkItem verwenden. Unter Vista sind die neuen Thread-Pool-APIs zuverlässiger und bieten einige erweiterte Optionen. Jeder bewirkt, dass Ihr Hintergrundcode in einem Thread-Thread gestartet wird.

%Vor%     
Michael 27.02.2009 23:27
quelle
2

Einfaches Threading in C ++ ist ein Widerspruch in sich!

Sehen Sie sich die Boost-Threads an, die einem einfachen, heute verfügbaren Ansatz am nächsten kommen.

Für eine minimale Antwort (die Ihnen nicht alle Dinge liefert, die Sie für die Synchronisation benötigen, sondern Ihre Frage im wörtlichen Sinne beantworten):

Ссылка

Auch static bedeutet etwas anderes in C ++.

    
Daniel Earwicker 27.02.2009 20:08
quelle
1

Ist das sicher?

%Vor%

Muss ich nach diesem Aufruf etwas tun, um den Speicher freizugeben (wie CloseHandle)?

    
Jon Tackabury 27.02.2009 20:18
quelle
1

Eine andere Alternative ist pthreads - sie funktionieren sowohl auf Windows als auch auf Linux!

    
sean riley 16.03.2009 19:55
quelle
0
  

CreateThread (Win32) und AfxBeginThread (MFC) sind zwei Möglichkeiten, dies zu tun.

Achten Sie darauf, _beginthread zu verwenden, wenn Sie die C-Laufzeitbibliothek (CRT) verwenden müssen.

    
rotoglup 27.02.2009 20:14
quelle
0

Nur für win32 und ohne zusätzliche Bibliotheken, die Sie verwenden können CreateThread-Funktion Ссылка

    
Mykola Golubyev 27.02.2009 20:14
quelle
0

Wenn Sie wirklich keine Drittanbieter-Bibliotheken verwenden wollen (ich würde boost :: thread wie in den anderen anwsers beschrieben empfehlen), müssen Sie die Win32API verwenden:

%Vor%     
Edouard A. 27.02.2009 20:15
quelle
0

Es gibt viele plattformübergreifende Open-Source-C ++ - Threading-Bibliotheken, die Sie verwenden könnten:

Unter ihnen sind:

Qt
Intel
TBB Boost-Thread

Wie Sie es beschreiben, denke ich, dass entweder Intel TBB oder Boost-Thread in Ordnung sein wird.

Intel TBB Beispiel:

%Vor%

Boost-Thread-Beispiel:
Ссылка

Qt Beispiel:
Ссылка
(I Denken Sie nicht, dass dies Ihren Bedürfnissen entspricht, sondern nur der Vollständigkeit halber hier enthalten ist: Sie müssen QThread erben, void run () implementieren und QThread :: start ()) aufrufen:

Wenn Sie nur unter Windows programmieren und sich nicht um Crossplatform kümmern, könnten Sie vielleicht Windows-Thread direkt verwenden:
Ссылка

    
sivabudh 27.02.2009 20:25
quelle

Tags und Links