Vlákna POSIX

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 10. dubna 2021; kontroly vyžadují 11 úprav .

POSIX Threads  je standard POSIX pro implementaci vláken (vlákna) provádění . Standard POSIX.1c, Threads extensions ( IEEE Std 1003.1c-1995) definuje API pro správu vláken, synchronizaci a plánování.

Implementace tohoto API existují pro velké množství operačních systémů podobných UNIX ( GNU/Linux , Solaris , FreeBSD , OpenBSD , NetBSD , OS X ), stejně jako pro Microsoft Windows a další operační systémy.

Knihovny, které implementují tento standard (a funkce tohoto standardu), se obvykle nazývají Pthreads (funkce mají předponu "pthread_").

Základní funkce standardu

Pthreads definuje sadu typů a funkcí v programovacím jazyce C . Soubor záhlaví  je pthread.h.

Příklad

Příklad použití vláken v jazyce C :

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> void wait_thread ( void ); void * thread_func ( void * ); int main ( int argc , char * argv [], char * envp []) { pthread_t vlákno ; if ( pthread_create ( & thread , NULL , thread_func , NULL )) return EXIT_FAILURE ; for ( unsigned int i = 0 ; i < 20 ; i ++ ) { klade ( "a" ); wait_thread (); } if ( pthread_join ( vlákno , NULL )) return EXIT_FAILURE ; return EXIT_SUCCESS ; } void wait_thread ( void ) { time_t start_time = čas ( NULL ); while ( čas ( NULL ) == počáteční_čas ) {} } void * thread_func ( void * vptr_args ) { for ( unsigned int i = 0 ; i < 20 ; i ++ ) { fputs ( "b \n " , stderr ); wait_thread (); } vrátit NULL ; }

Příklad použití vláken v C++ :

#include <cstdlib> #include <iostream> #include <paměť> #include <unistd.h> #include <pthread.h> třída vlákno { veřejnost : virtuální ~ vlákno () {} virtuální void běh () = 0 ; int start () { return pthread_create ( & _ThreadId , NULL , Thread :: thread_func , this ); } int wait () { return pthread_join ( _ThreadId , NULL ); } chráněno : pthread_t _ThreadId ; Thread ( const Thread & ); void * thread_func ( void * d ) { ( static_cast < vlákno *> ( d )) -> spustit (); vrátit NULL ; } }; class TestingThread : public Thread { veřejnost : TestingThread ( const char * pcszText ) : _pcszText ( pcszText ) {} virtuální void spustit () { for ( unsigned int i = 0 ; i < 20 ; i ++ , Sleep ( 1000 )) std :: cout << _pcszText << std :: endl ; } chráněno : const char * _pcszText ; }; int main ( int argc , char * argv [], char * envp []) { TestingThread ThreadA ( "a" ); TestingThread ThreadB ( "b" ); vrátit vláknoA . začít () || VláknoB . začít () || VláknoA . počkat () || VláknoB . počkat () ? EXIT_FAILURE : EXIT_SUCCESS ; }

Zobrazené programy používají dvě vlákna, která tisknou zprávy do konzole, jedno, které tiskne 'a' a jedno, které tiskne 'b'. Výstup zpráv je smíšený v důsledku přepínání spouštění mezi vlákny nebo souběžného spouštění na víceprocesorových systémech .

Rozdíl je v tom, že program C vytvoří jedno nové vlákno pro tisk 'b', zatímco hlavní vlákno tiskne 'a'. Hlavní vlákno (po vytištění 'aaaaa….') čeká na ukončení podřízeného vlákna.

Program C++ vytvoří dvě nová vlákna, jedno vypíše 'a' a druhé 'b'. Hlavní vlákno čeká na dokončení obou podřízených vláken.

Viz také

Odkazy