Phreads
POSIX -Threads, Üblicherweise bekannt als phreads, ist ein Ausführungsmodell Das existiert unabhängig von einer Sprache sowie einem parallelen Ausführungsmodell. Es ermöglicht ein Programm, mehrere verschiedene Arbeitsströme zu steuern, die sich mit der Zeit überschneiden. Jeder Arbeitsfluss wird als als bezeichnet Fadenund die Erstellung und Kontrolle über diese Strömungen werden erreicht, indem Anrufe bei der POSIX -Threads -API tätig werden. Posix Themen ist ein API definiert durch den Standard Pox.1c, Thread -Erweiterungen (IEEE STD 1003.1C-1995).
Implementierungen der API sind bei vielen verfügbar Unix-artig Posix-konformante Betriebssysteme wie z. Freebsd, Netbsd, OpenBSD, Linux, Mac OS, Android,[1] Solaris, Redox, und Autosar Adaptiv, typischerweise als Bibliothek gebündelt libpThread. DR-DOS und Microsoft Windows Implementierungen existieren auch: innerhalb der SFU/SUA Subsystem, das eine native Implementierung einer Reihe von POSIX -APIs und auch innerhalb liefert dritte Seite Pakete wie PTHREADS-W32,[2] was implementiert phreads vorhanden Windows -API.
Inhalt
phreads definiert einen Satz von C Programmiersprache Typen, Funktionen und Konstanten. Es wird mit a implementiert pthread.h
Header und ein Faden Bibliothek.
Es gibt rund 100 Thread -Prozeduren, die alle vorangestellt sind pthread_
und sie können in vier Gruppen eingeteilt werden:
- Thread Management - Erstellen, Verbinden von Threads usw.
- Mutexes
- Zustandsvariablen
- Synchronisation Zwischen Threads unter Verwendung von Lese-/Schreibschlössern und Barrieren
Der posix Semaphor API funktioniert mit POSIX -Threads, ist jedoch nicht Teil des Threads Standard, der in der definiert wurde POSIX.1B, Echtzeit-Erweiterungen (IEEE STD 1003.1B-1993) Standard. Folglich werden die Semaphor -Verfahren durch vorangestellt SEM_
Anstatt von pthread_
.
Beispiel
Ein Beispiel, das die Verwendung von veranschaulicht phreads in C:
#enthalten #enthalten #enthalten #enthalten #enthalten #define num_threads 5 Leere *Perform_work(Leere *Argumente) { int Index = *((int *)Argumente); int Schlafenszeit = 1 + Rand() % Num_threads; printf("Thread %D: Begonnen.\n", Index); printf("Thread %d: wird für %d Sekunden schlafen.\n", Index, Schlafenszeit); schlafen(Schlafenszeit); printf("Thread %d: Ende.\n", Index); Rückkehr NULL; } int hauptsächlich(Leere) { pthread_t Themen[Num_threads]; int thread_args[Num_threads]; int i; int result_code; // Erstellen Sie alle Threads nacheinander zum (i = 0; i < Num_threads; i++) { printf("In Main: Erstellen von Thread %d.\n", i); thread_args[i] = i; result_code = pthread_create(&Themen[i], NULL, Perform_work, &thread_args[i]); behaupten(!result_code); } printf("In Main: Alle Threads werden erstellt.\n"); // Warten Sie, bis jeder Thread abgeschlossen ist zum (i = 0; i < Num_threads; i++) { result_code = pthread_join(Themen[i], NULL); behaupten(!result_code); printf("In Main: Thread %D ist beendet.\n", i); } printf("Das Hauptprogramm ist beendet.\n"); Rückkehr 0; }
Dieses Programm erstellt fünf Themen, die jeweils die Funktion ausführen Perform_work Das druckt die eindeutige Anzahl dieses Threads in die Standardausgabe. Wenn ein Programmierer wollte, dass die Threads miteinander kommunizieren, muss eine Variable außerhalb des Umfangs einer der Funktionen definiert werden, wodurch sie eine Globale Variable. Dieses Programm kann mit dem kompiliert werden GCC Compiler mit dem folgenden Befehl:
gcc pthreads_demo.c -phread -o pthreads_demo
Hier ist einer der vielen möglichen Ausgänge aus der Ausführung dieses Programms.
In Main: Thread 0 erstellen 0. In Main: Erstellen von Thread 1. In Main: Erstellen von Thread 2. In Main: Erstellen von Thread 3. Thread 0: Start. In Main: Erstellen von Thread 4. Thread 3: Start. Thread 2: Start. Thread 0: Schläft 3 Sekunden lang. Thread 1: Start. Thread 1: Wird 5 Sekunden lang schlafen. Thread 2: Wird 4 Sekunden lang schlafen. Thread 4: Start. Thread 4: Wird 1 Sekunden lang schlafen. In Main: Alle Threads werden erstellt. Thread 3: Wird 4 Sekunden lang schlafen. Thread 4: Ende. Thread 0: Ende. In Main: Thread 0 ist beendet. Thread 2: Ende. Thread 3: Ende. Thread 1: Ende. In Main: Thread 1 ist beendet. In Main: Thread 2 ist beendet. In Main: Thread 3 ist beendet. In Main: Thread 4 ist beendet. Das Hauptprogramm ist beendet.
POSIX -Threads für Windows
Windows unterstützt die nicht phreads Standard nativ, damit das Pthreads4W-Projekt versucht, eine tragbare und Open-Source-Wrapper-Implementierung bereitzustellen. Es kann auch verwendet werden, um Port zu portieren Unix Software (die verwendet phreads) mit wenig oder gar nicht zur Windows -Plattform.[3] Pthreads4w Version 3.0.0[4] oder später, das unter der Apache Public Lizenz v2.0 veröffentlicht wurde, ist mit 64-Bit- oder 32-Bit-Windows-Systemen kompatibel. Version 2.11.0,[5] unter der LGPLV3-Lizenz veröffentlicht, ist ebenfalls 64-Bit oder 32-Bit-kompatibel.
Das Mingw-W64-Projekt enthält auch eine Wrapper-Implementierung von phreads, Winphreads, was versucht, mehr native Systemaufrufe zu verwenden als das Pthreads4W -Projekt.[6]
Interix Umweltsubsystem in der verfügbaren Windows-Dienste für UNIX/Subsystem für UNIX-basierte Anwendungen Paket bietet einen nativen Port der phreads API, d. H. Nicht auf Win32/Win64 -API zugeordnet, sondern direkt auf dem Betriebssystem gebaut symall Schnittstelle.[7]
Siehe auch
- Laufzeitsystem
- OpenMP
- Cilk/Cilk Plus
- Fadenbausteine (TBB)
- Native POSIX Thread Library (Nptl)
- Dcetheads
- Klon (Linux -Systemaufruf)
- Falsches Aufwachen
- Thread-lokaler Speicher
- GNU tragbare Threads
- Grand Central Dispatch (Apple Thread Library)
- Beginthread (Ein Unterprogramm in Windows zum Erstellen eines neuen Threads und Unix -Threads)
- Zustandsfäden, ein ereignisgesteuerter Ansatz zum Fadenzusagen
Verweise
- ^ "libc/bionic/pthread.c - Plattform/Bionic - Git bei Google". android.googlesource.com.
- ^ "PThread Win-32: Niveau der Standardkonformität". 2006-12-22. Abgerufen 2010-08-29.
- ^ Hart, Johnson M. (2004-11-21). "Experimente mit der Open Source PThreads -Bibliothek und einigen Kommentaren". Archiviert von das Original Am 2010-08-30. Abgerufen 2010-08-29.
- ^ https://sourceforge.net/projects/pthreads4w/files/ -Datei: pthreads4w-code-v3.0.0.zip-Quelle für pthreads4W v3.0.0
- ^ https://sourceforge.net/projects/pthreads4w/files/ -Datei: pthreads4w-code-v2.11.0.zip-Quelle für pthreads4W v2.11.0
- ^ sehen http://locklessinc.com/articles/phreads_on_windows Woher wurde es ursprünglich abgeleitet
- ^ "Kapitel 1: Einführung in Windows Services für UNIX 3.5".
Weitere Lektüre
- David R. Butenhof (1997). Programmierung mit POSIX -Threads. Addison-Wesley. ISBN 978-0-201-63392-4.
- Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (September 1996). PTHREADS -Programmierung. O'Reilly & Associates. ISBN 978-1-56592-115-3.
- Charles J. Northrup (1996-01-25). Programmierung mit Unix -Threads. John Wiley & Sons. ISBN 978-0-471-13751-1.
- Kay A. Robbins & Steven Robbins (2003). UNIX Systems Programmierung. Prentice-Hall. ISBN 978-0-13-042411-2.