So verwenden Sie Threads in Projekten

Bedeutung

Der Hauptzweck der Verwendung von Threads besteht darin, die gleichzeitige Ausführung mehrerer Aufgaben zu erreichen und die Programmleistung und Reaktionsfähigkeit zu verbessern. Threads ermöglichen es einem Programm, mehrere Aufgaben gleichzeitig auszuführen. Zeitaufwändige Vorgänge und Aufgaben, die eine gleichzeitige Verarbeitung erfordern, können in verschiedenen Threads platziert werden, wodurch die Ausführungseffizienz des Programms verbessert wird.

Hier sind einige häufige Situationen und Vorteile der Verwendung von Threads:

  1. Gleichzeitige Verarbeitung: Threads können mehrere Aufgaben gleichzeitig ausführen, sodass das Programm mehrere Ereignisse oder Anforderungen gleichzeitig verarbeiten kann, wodurch die Parallelitätsleistung des Systems verbessert wird.

  2. Gleichzeitiger Zugriff auf Ressourcen: Mehrere Threads können gleichzeitig auf gemeinsam genutzte Ressourcen wie Dateien, Datenbanken oder Netzwerkverbindungen zugreifen und so eine effiziente Ressourcennutzung erreichen.

  3. Verbessern Sie die Reaktionsfähigkeit des Programms: Durch die Ausführung zeitaufwändiger Vorgänge in einem Hintergrundthread kann der Hauptthread reaktionsfähig bleiben und die Benutzererfahrung verbessern.

  4. Parallelverarbeitung: Multithreading kann Aufgaben parallel auf mehreren Prozessoren oder Multi-Core-Systemen ausführen, wodurch die Rechenressourcen voll ausgenutzt werden und die Verarbeitungsfähigkeiten des Programms verbessert werden.

winnt.h ist eine der Header-Dateien des Windows-Betriebssystems, die viele Typen, Makros und Funktionen im Zusammenhang mit der Windows-API definiert. Die Funktion _beginthreadex() ist eine von der Windows-API bereitgestellte Thread-Erstellungsfunktion, mit der ein neuer Thread erstellt und sofort mit der Ausführung der angegebenen Thread-Funktion begonnen wird.

Die<thread>-Headerdatei ist eine Headerdatei, die in der C++-Standardbibliothek für Thread-Operationen bereitgestellt wird und die Definition derstd::thread-Klasse enthält. Die Klasse std::thread ist eine Klasse zum Erstellen und Verwalten von Threads in der C++-Standardbibliothek. Sie stellt einige Mitgliedsfunktionen und Operatoren zum Erstellen von Threads und zum Ausführen bestimmter Thread-Funktionen bereit.

Der Unterschied zwischen den beiden ist wie folgt:

  • winnt.hEs handelt sich um die Header-Datei des Windows-Betriebssystems und wird zum Ausführen von Vorgängen auf Systemebene mithilfe der von der Windows-API bereitgestellten Funktionen und Typen verwendet.
  • <thread>Es handelt sich um die Header-Datei der C++-Standardbibliothek und wird zum Erstellen und Verwalten von Threads in C++-Programmen verwendet.

In einer bestimmten Entwicklung können Sie auswählen, welche Methode Sie verwenden möchten, um Threads entsprechend Ihren Anforderungen zu erstellen und zu verwalten. Wenn Sie auf der Windows-Plattform entwickeln, können Sie Windows-API-Funktionen zum Erstellen von Threads verwenden; wenn Sie plattformübergreifend entwickeln, können Sie die Klasse std::thread in der C++-Standardbibliothek zum Erstellen von Threads verwenden.

采用winnt.h

Unter normalen Umständen können Sie das Objekt über GetInstance() instanziieren und dann offiziell einen Thread betreten. Geben Sie die Funktion Run() wie folgt ein:

void Server::Run()
{
	HANDLE hThread[1];  
	hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ServerThread, this, 0, NULL);
}

In diesem Code wird die Windows-API-Funktion _beginthreadex() verwendet, um einen neuen Thread zum Ausführen der Funktion ServerThread zu erstellen.

Die konkrete Erklärung lautet wie folgt:

  1. HANDLE hThread[1];: Definiert ein Array vom Typ mit dem Namen hThread, das zum Speichern des Handles des Threads verwendet wird. HANDLE

  2. hThread[0] = (HANDLE)_beginthreadex(NULL, 0, TcpServerThread, this, 0, NULL);: Rufen Sie die Funktion _beginthreadex() auf, um einen neuen Thread zu erstellen und das Thread-Handle in hThread[0] zu speichern.

    _beginthreadex()Bei der Funktion handelt es sich um eine Thread-Erstellungsfunktion der Windows-API, mit der ein neuer Thread erstellt und die Ausführung sofort gestartet wird. Spezifische Parametererklärung:
    • NULL: Stellt die Thread-ID dar, die zum Abrufen der Thread-ID verwendet wird und hier nicht verwendet wird.
    • 0: Gibt die Erstellungsoptionen an, wenn der Thread ausgeführt wird. Der Standardwert ist 0.
    • this: Gibt an, dass der Zeiger des aktuellen Objekts als Parameter an die Thread-Funktion übergeben wird.
    • ServerThread: Gibt die auszuführende Thread-Funktion an. Diese Funktion sollte im folgenden Code definiert werden.
    • 0: Zeigt die Verwendung der Standard-Thread-Stapelgröße an.
    • NULL: Zeigt die Verwendung der standardmäßigen Thread-Sicherheitseigenschaften an.
  3. Durch den obigen Code wird ein neuer Thread erstellt und beginnt mit der Ausführung der FunktionTcpServerThread.

Es ist zu beachten, dass in diesem Codeausschnitt nur ein Thread erstellt wird, dahThreaddas Array nur ein Element enthält. Wenn Sie mehrere Threads erstellen müssen, können Sie hThread als Array mit mehreren Elementen definieren und die Funktion _beginthreadex() in einer Schleife verwenden, um mehrere Threads zu erstellen. Darüber hinaus müssen Sie nach der Verwendung des Threads die Thread-Ressourcen entsprechend freigeben, z. B. durch Aufrufen der Funktion CloseHandle() an der entsprechenden Stelle, um das Handle zu schließen.

Schauen wir uns dann die auszuführende Thread-Funktion anServerThread()

unsigned int __stdcall ServerThread(PVOID arg)
{
	Server * pThread = (Server *)arg;  
	pThread->Communicate(); 
	return 0;
}

Die konkrete Erklärung lautet wie folgt:

  1. unsigned int __stdcall ServerThread(PVOID arg): Eine Funktion mit dem Namen ServerThread ist definiert, der Rückgabetyp ist unsigned int und der Parametertyp ist PVOID ( d. h. void*).

    __stdcall ist eine Aufrufkonvention, die angibt, wie Funktionsparameter übergeben werden und wie der Stapel bereinigt wird. Auf Windows-Plattformen verwenden Thread-Funktionen normalerweise die Aufrufkonvention __stdcall.
  2. Server * pThread = (Server *)arg;: Konvertieren Sie den an die Thread-Funktion übergebenen Parameter arg in den Typ Server* und weisen Sie ihn dem Objekt mit dem Namen pThreadLokale Variablen. Der hier übergebene Parameter arg wurde in der obigen Funktion erwähnt. Er lautet . Dieser Parameter bedeutet, dass der Zeiger des aktuellen Objekts als Parameter an die Thread-Funktion übergeben wird. _beginthreadex()this

  3. pThread->Communicate();: Rufen Sie die Methode der Klasse über den Zeiger pThread auf. ServerCommunicate()

  4. return 0;: Gibt 0 zurück, was anzeigt, dass die Thread-Ausführung abgeschlossen ist.

Dieser Artikel wird fortgesetzt 

Guess you like

Origin blog.csdn.net/weixin_55696427/article/details/134420806