POSIX szálak

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. április 10-én felülvizsgált verziótól ; az ellenőrzések 11 szerkesztést igényelnek .

A POSIX Threads  a POSIX szabvány a végrehajtási szálak (szálak) megvalósításához . A POSIX.1c szabvány, a Threads extensions ( IEEE Std 1003.1c-1995) API -t határoz meg a szálkezeléshez, szinkronizáláshoz és ütemezéshez.

Ennek az API-nak a megvalósítása számos UNIX - szerű operációs rendszerhez ( GNU/Linux , Solaris , FreeBSD , OpenBSD , NetBSD , OS X ), valamint Microsoft Windowshoz és más operációs rendszerekhez létezik.

Azokat a könyvtárakat, amelyek megvalósítják ezt a szabványt (és ennek a szabványnak a függvényeit), általában Pthread -nek nevezik (a függvények előtagja "pthread_").

A szabvány alapvető funkciói

A Pthreads típusok és függvények halmazát határozza meg a C programozási nyelvben . A fejléc fájl  pthread.h.

Példa

Példa a szálak használatára C nyelvben :

#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 szál ; if ( pthread_create ( & szál , NULL , thread_func , NULL )) return EXIT_FAILURE ; for ( unsigned int i = 0 ; i < 20 ; i ++ ) { tesz ( "a" ); várjon_szál (); } if ( pthread_join ( szál , NULL )) return EXIT_FAILURE ; return EXIT_SUCCESS ; } void wait_thread ( void ) { time_t start_time = idő ( NULL ); while ( time ( NULL ) == start_time ) {} } void * thread_func ( void * vptr_args ) { for ( unsigned int i = 0 ; i < 20 ; i ++ ) { fputs ( "b \n " , stderr ); várjon_szál (); } return NULL ; }

Példa a szálak használatára C++ nyelven :

#include <cstdlib> #include <iostream> #include <memória> #include <unistd.h> #include <pthread.h> class Thread { nyilvános : virtuális ~ Szál () {} virtuális üres futás () = 0 ; int start () { return pthread_create ( & _ThreadId , NULL , Thread :: thread_func , this ); } int vár () { return pthread_join ( _ThreadId , NULL ); } védett : pthread_t _ThreadId ; Szál ( const Szál & ); void * thread_func ( void * d ) { ( static_cast < Thread *> ( d )) -> fut (); return NULL ; } }; class TestingThread : public Thread { nyilvános : TestingThread ( const char * pcszText ) : _pcszText ( pcszText ) {} virtual void run () { for ( unsigned int i = 0 ; i < 20 ; i ++ , Sleep ( 1000 )) std :: cout << _pcszText << std :: endl ; } védett : const char * _pcszText ; }; int main ( int argc , char * argv [], char * envp []) { TestingThread ThreadA ( "a" ); TestingThread ThreadB ( "b" ); return ThreadA . kezdés () || ThreadB . kezdés () || ThreadA . várj () || ThreadB . várj () ? EXIT_FAILURE : EXIT_SUCCESS ; }

A bemutatott programok két szálat használnak, amelyek üzeneteket nyomtatnak a konzolra: az egyik az „a” betűt, a másik a „b” betűt írja ki. Az üzenetkimenet keveredik a szálak közötti végrehajtási váltás vagy a többprocesszoros rendszereken történő párhuzamos végrehajtás eredményeként .

A különbség az, hogy a C program egy új szálat hoz létre a 'b' kinyomtatására, míg a főszál az 'a' betűt. A főszál (az 'aaaaa….' kinyomtatása után) várja, hogy a gyermekszál véget érjen.

A C++ program két új szálat hoz létre, az egyik 'a'-t, a másik 'b'-t nyomtat. A főszál mindkét gyermekszál befejezésére vár.

Lásd még

  • Natív POSIX szálkönyvtár (NPTL)
  • GNU hordozható szálak
  • Többszálú C++ könyvtárak listája

Linkek