Τα **νήματα POSIX**, που συνήθως αναφέρονται σαν **Pthreads**, είναι η υλοποίηση της τυποποίησης POSIX για νήματα. Το πρότυπο *POSIX.1c, Threads extensions (IEEE Std 1003.1c-1995)* είναι αυτό που ορίζει το προγραμματιστικό περιβάλλον (API) για δημιουργία και τροποποίηση νημάτων.

Υλοποίηση του POSIX API υπάρχει σε πολλά λειτουργικά συστήματα τύπου Unix όπως FreeBSD, NetBSD, OpenBSD, GNU/Linux, Mac OS X and Solaris. Στα Microsoft Windows και το DR-DOS υπάρχει υλοποίηση του POSIX API, όπως η βιβλιοθήκη *pthreads-w32*, η οποία υλοποιεί τα pthreads πάνω στο υπάρχον API των Windows.

Περιγραφή
---------

Το pthreads είναι μια σειρά δομών δεδομένων, σταθερών και συναρτήσεων σε γλώσσα προγραμματισμού C. Υπάρχει το αρχείο επικεφαλίδας (header) pthread.h και η βιβλιοθήκη *thread*.

Υπάρχουν περίπου 100 συναρτήσεις για Pthreads. Όλες ξεκινάνε με το όνομα "pthread\_" και μπορούν να κατηγοριοποιηθούν σε τέσσερις ομάδες:

* Διαχείριση νημάτων - δημιουργία, ενώσεις (joining) κλπ.
* Mutexes
* Μεταβλητές ελέγχου.
* Συγχρονισμός μεταξύ νημάτων χρησιμοποιώντας τεχνικές κλειδώματος, διαβάσματος/γραψίματος κρίσιμης περιοχής.

Το POSIX API σεμαφόρων (semaphores) λειτουργεί με τα POSIX νήματα αλλά δεν είναι μέρος του στάνταρντ POSIX νημάτων καθώς ορίζεται από το ξεχωριστό στάνταρντ *POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993)*. Οι συναρτήσεις του API των σεμαφόρων ξεκινάνε με το όνομα "sem\_" αντί του "pthread\_".

Παράδειγμα
----------

Σε παρακάτω παράδειγμα στην C βλέπουμε την χρήστη της βιβλιοθήκης Pthreads:

```
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define NUM\_THREADS 5
 
void \*task\_code(void \*argument) {
 int tid;
 
 tid = \*((int \*) argument);
 printf("Γεια σου Κόσμε! Είμαι το νήμα %d!\n", tid);
 
 /\* προαιρετικό: μέρος για πιο χρήσιμο εκτελέσιμο κώδικα \*/
 
 return NULL;
}
 
int main(void) {
 pthread\_t threads[NUM\_THREADS];
 int thread\_args[NUM\_THREADS];
 int rc, i;
 
 // δημιουργία όλων των διεργασιών μια προς μια
 for (i=0; i<NUM\_THREADS; ++i) {
 thread\_args[i] = i;
 printf("Στην main: δημιουργώ το νήμα %d\n", i);
 rc = pthread\_create(&threads[i], NULL, task\_code, (void \*) &thread\_args[i]);
 assert(0 == rc);
 }
 
 // περίμενε κάθε νήμα να τελειώσει
 for (i=0; i<NUM\_THREADS; ++i) {
 // μπλοκάρισε μέχρι να τελειώσει το νήμα i 
 rc = pthread\_join(threads[i], NULL);
 printf("Στην main: νήμα %d ολοκληρώθηκε\n", i);
 assert(0 == rc);
 }
 
 printf("Στην main: Όλα τα νήματα τελείωσαν με επιτυχία!\n");
 exit(EXIT\_SUCCESS);
}

```

Αυτό το πρόγραμμα δημιουργεί πέντε νήματα όπου το κάθε νήμα εκτελεί την συνάρτηση *task\_code* η οποία τυπώνει το μοναδικό αριθμό που έχει το νήμα. Αν ο προγραμματιστής ήθελε τα νήματα να επικοινωνούν το ένα με το άλλο θα έπρεπε να ορίσει μια κοινή μεταβλητή μέσα στο κώδικα. Κατά την εκτέλεση του παραπάνω προγράμματος βγάζει τα μηνύματα (η σειρά εμφάνισης των μηνυμάτων διαφέρει σε κάθε ξεχωριστή εκτέλεση μιας και τα νήματα τρέχουν παράλληλα).

```
$ gcc threads_hello_world.c -lpthread -o threads_hello_world 
$ ./threads_hello_world 
Στην main: δημιουργώ το νήμα 0
Στην main: δημιουργώ το νήμα 1
Γεια σου Κόσμε! Είμαι το νήμα 0!
Στην main: δημιουργώ το νήμα 2
Στην main: δημιουργώ το νήμα 3
Γεια σου Κόσμε! Είμαι το νήμα 1!
Στην main: δημιουργώ το νήμα 4
Γεια σου Κόσμε! Είμαι το νήμα 3!
Στην main: νήμα 0 ολοκληρώθηκε
Στην main: νήμα 1 ολοκληρώθηκε
Γεια σου Κόσμε! Είμαι το νήμα 2!
Στην main: νήμα 2 ολοκληρώθηκε
Στην main: νήμα 3 ολοκληρώθηκε
Γεια σου Κόσμε! Είμαι το νήμα 4!
Στην main: νήμα 4 ολοκληρώθηκε
Στην main: Όλα τα νήματα τελείωσαν με επιτυχία!

```

Νήματα POSIX στα Windows
------------------------

Τα Windows δεν υποστηρίζουν εγγενώς το πρότυπο των POSIX threads (pthreads) και για το λόγο αυτό υπάρχει το εγχείρημα Pthreads-w32 όπου γίνεται προσπάθεια να υλοποιηθεί μια λύση ανοικτού λογισμικού. Η βιβλιοθήκη αυτή μπορεί να χρησιμοποιηθεί για να μεταγλωττιστεί λογισμικό που τρέχει σε Unix (και χρησιμοποιεί pthreads) με ελάχιστη τροποποίηση στην πλατφόρμα των windows. Με κάποιες προσθήκες η τελευταία έκδοση της βιβλιοθήκης (2.8.0 - 2.9.0) είναι συμβατή και με την έκδοση 64-bit των Windows.

Επίσης το εγχείρημα mingw-w64 περιέχει μια άλλη υλοποίηση των pthreads και winpthreads, όπου γίνεται προσπάθεια να καλούνται κατευθείαν κλήσεις συστήματος σε αντιπαραβολή με το εγχείρημα Pthreads-w32 το οποίο τρέχει πάνω από το API των Windows 

Το περιβάλλον *Interix* είναι υποσύστημα των υπηρεσιών Unix των Windows και παρέχει κατευθείαν κλήσεις λειτουργικού συστήματος (χρήση της κλήσης συστήματος) για υποστήριξη pthreads API.

Παραπομπές
----------

1. ↑  «Pthread Win-32: Level of standards conformance». 22 Δεκεμβρίου 2006. Αρχειοθετήθηκε από το πρωτότυπο στις 11 Ιουνίου 2010. Ανακτήθηκε στις 29 Αυγούστου 2010.
2. ↑  Pthreads-w32
3. ↑  Hart, Johnson M. (21 Νοεμβρίου 2004). «Experiments with the Open Source Pthreads Library and Some Comments». Αρχειοθετήθηκε από το πρωτότυπο στις 30 Αυγούστου 2010. Ανακτήθηκε στις 29 Αυγούστου 2010.
4. ↑  «pthread-win32\_x64.zip Source and binary for Pthreads-w32 v2.8.0». 26 Ιανουαρίου 2010. Ανακτήθηκε στις 29 Αυγούστου 2010.
5. ↑  «Forum discussion: pthreads-on-64bit-Windows». 26 Ιανουαρίου 2010. Αρχειοθετήθηκε από το πρωτότυπο στις 15 Δεκεμβρίου 2010. Ανακτήθηκε στις 29 Αυγούστου 2010.
6. ↑  «Compile pthreads – mingw-w64». Αρχειοθετήθηκε από το πρωτότυπο στις 2 Ιουλίου 2012. Ανακτήθηκε στις 27 Μαΐου 2014.
7. ↑   -- the "64 bit" mentions
8. ↑  mingw-w64 - Revision 5520: /experimental/winpthreads[*νεκρός σύνδεσμος*]
9. ↑  Δείτε σχετικά στο:
10. ↑  «Chapter 1: Introduction to Windows Services for UNIX 3.5».

Βιβλιογραφία
------------

* David R. Butenhof. *Programming with POSIX Threads*. Addison-Wesley. ISBN 0-201-63392-2.
* Bradford Nichols, Dick Buttlar, Jacqueline Proulx Farell. *Pthreads Programming*Απαιτείται δωρεάν εγγραφή. O'Reilly & Associates. ISBN 1-56592-115-1. CS1 maint: Πολλαπλές ονομασίες: authors list (link)
* Charles J. Northrup (1996). *Programming with UNIX Threads*. John Wiley & Sons. ISBN 0-471-13751-0.
* Kay A. Robbins and Steven Robbins. *UNIX Systems Programming*Απαιτείται δωρεάν εγγραφή. Prentice-Hall. ISBN 0-13-042411-0.
* Robbins, Daniel. «POSIX threads explained: A simple and nimble tool for memory sharing». *01 Ιουλίου 2000*. IBM developer works. Ανακτήθηκε στις 27 Μαΐου 2014.

Εξωτερικοί σύνδεσμοι
--------------------

* The Open Group Base Specifications Issue 7, IEEE Std 1003.1


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| π • σ • ε
Θέματα παράλληλου προγραμματισμού |
| --- |
|  |
| Επισκόπηση | 
Υπολογιστικό νέφος · Υπολογιστική συστάδα · Κατανεμημένος προγραμματισμός · Υπολογιστικό πλέγμα |
|  |
| Παραλληλισμός (επίπεδα) | 
Bit · Εντολής · Δεδομένων · Εργασιών |
|  |
| Νήματα υλικού | 
Υπερνημάτωση |
|  |
| Θεωρία | 
Νόμος του Άμνταλ · Νόμος του Γκούσταφσον · Κλιμακωσιμότητα · Μετρική Καρπ-Φλατ · Επιβράδυνση παραλληλισμού · Επιτάχυνση παραλληλισμού |
|  |
| Θεμέλια στοιχεία | 
Διεργασία · Νήμα · PRAM · Πράσινα νήματα |
|  |
| Συγχρονισμός | 
Πολυεπεξεργασία · Multithreading · Memory coherency · Cache coherency · Barrier · Synchronization · Application checkpointing |
|  |
| Προγραμματισμός | 
Μοντέλα (Έμμεσος παραλληλισμός · Ρητός παραλληλισμός · Ταυτοχρονισμός) · Ταξινομία του Φλυν (SISD • SIMD • MISD • MIMD (SPMD)) |
|  |
| Υλικό υπολογιστών | 
Πολυπεξεργασία (Συμμετρική · Ασυμμετρική) · Μνήμη (NUMA · COMA · κατανεμημένη · κοινή · κατανεμημένη κοινή) · SMT
MPP · Υπερβαθμωτός επεξεργαστής · Διανυσματικός επεξεργαστής · Υπερυπολογιστής · *Beowulf* |
|  |
| Βιβλιοθήκες και API | 
Νήματα POSIX · OpenMP · PVM · MPI · UPC · Intel Threading Building Blocks · Boost.Thread · Global Arrays · Charm++ · Cilk · Co-array Fortran · CUDA |

 |