Νήματα με την χρήση των Posix Threads (pthreads)
εισαγωγή τα νήματα είναι ανεξάρτητες ροές εντολών που εκτελούνται με τρόπο αυθαίρετο από το χρονοπρογραμματιστή του λειτουργικού συστήματος ζουν στο πλαίσιο μιας διεργασίας μοιράζονται την μνήμη με την κύρια διεργασία αλλά διαθέτουν την δική τους στοίβα και καταχωρητές. τερματίζουν είτε μόνα τους είτε με τον τερματισμό της κύριας διεργασίας.
pthreads API το pthreads API καθορίζεται από το POSIX (Portable Operating System for Information Exchange ) πρότυπο. οι συναρτήσεις του phtreadsAPI μπορούν να κατηγοριοποιηθούν χοντρικά σε δυο κύριες κατηγορίες Χειρισμού νημάτων δημιουργία, καταστροφή... αμοιβαίου αποκλεισμού (mutexes) δημιουργία κλειδώματος, καταστροφή κλειδώματος,... μεταβλητών συνθήκης (condition variables )
pthreads ΑPI ( βασικές κλήσεις χειρισμού νημάτων) pthread_create: δημιουργεί ένα καινούργιο νήμα. pthread_exit: καλείται από το νήμα στον τερματισμό. pthread_join: αναγκάζει το κυρίως πρόγραμμα που ξεκίνησε τα νήματα, να περιμένει μέχρι αυτά να τερματίσουν και να επιστρέψουν. pthread_yield: παραδίδει τον επεξεργαστή για να εκτελεστεί ένα άλλο νήμα.
τυπικός κύκλος ζωής νημάτων main(...){... pthread_create(...);.... pthread_join(...);.... exit(0); } κυρίως πρόγραμμα void * thread1(){... pthread_exit(...); } thread 1 thread 2 void * thread2(){... pthread_exit(...); }
μοντέλο μνήμης νημάτων
δημιουργία νήματος pthread_create(pthread_t * th,pthread_attr_t *attr, void (*start_routine)(void *),void * arg); pthread_t *t χειριστής του νήματος. pthread_attr_t *attr επιπλέον χαρακτηριστικά για το νήμα. Με NULL προεπιλέγονται τα βασικά χαρακτηριστικά void (*start_routine)(void *) η ρουτίνα που αποτελεί το νήμα void *arg τα ορίσματα της ρουτίνας που αποτελεί το νήμα
δημιουργία νήματος... η κλήση pthread_create αν είναι επιτυχημένη επιστρέφει ένα μοναδικό χαρακτηριστικό τύπου pthread_t για το νέο νήμα και η κλήση της ρουτίνας επιστρέφει 0. Σε περίπτωση λάθους η ρουτίνα επιστρέφει μη μηδενικό κωδικό λάθους. Επειδή στο όρισμα start_routine περνάμε μόνο την διεύθυνση της ρουτίνας-νήματος για τα ορίσματα που τυχόν έχει τα συγκεντρώνουμε σε μια struct και περνάμε το δείκτη σε αυτή στο όρισμα args.
τερματισμός νήματος pthread_exit(void * retval); τερματίζει την εκτέλεση του νήματος που την καλεί Παράλληλα στο όρισμα retval τοποθετούμε ένα δείκτη στα δεδομένα που πιθανόν θέλουμε να επιστρέψουμε στο πρόγραμμα που περιμένει στην pthread_join
αναμονή τερματισμού νημάτων pthread_join(pthread_t th, void ** thread_return) Αναβάλει την εκτέλεση του νήματος που την καλεί μέχρι να επιστρέψει το νήμα με το αναγνωριστικό th. Εαν το thread_return δεν είναι NULL τότε η τιμή που επιστρέφει το νήμα με το αναγνωριστικό th αποθηκεύεται στην περιοχή που δείχνει το thread_return
εθελοντική παράδοση του επεξεργαστή pthread_yield(); Το νήμα που την καλεί απελευθερώνει εθελοντικά τον επεξεργαστή μέχρι να του ξαναδοθεί από το λειτουργικό