pthreads - polito.itpthreads v the library posix threads Ø posix 1003.1c from 1995 Ø reviewd by...
TRANSCRIPT
![Page 1: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/1.jpg)
Thread in UNIX/Linux
Pthreads
![Page 2: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/2.jpg)
Thread
v SummarisingØ Traditionally each thread has a unique flow of
execution, i.e., does one thing at a timeØ To do more things simultaneously inside the same
process, several threads have to be activatedØ The process resources are common to all threads
belonging to the same processØ Since the memory is shared between several
threads, it's necessary to take care of its consistency
![Page 3: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/3.jpg)
Pthreads
v The library POSIX threadsØ POSIX 1003.1c from 1995Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition
v or Pthreads is the standard UNIX library for thread management
v PthreadsØ Is defined for C but it's available also in other
languages (e.g., FORTRAN)Ø Provides threada at user or kernel level
![Page 4: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/4.jpg)
Pthreads
v EssentiallyØ A thread is a program function (procedure) that is
executed independently from the rest of the program
Ø A cocurrent process made of several threads can be seen as a set of functions (procedures) executing independently and that share the process resources
![Page 5: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/5.jpg)
Pthreads
v Pthreads defines more than 60 thread management functions
v Pthreads allows toØ Create and manipulate threadsØ Synchronize threadsØ Protect the resources that are in common between
threadsØ Schedule threadsØ Destroy threads
![Page 6: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/6.jpg)
Pthreads
v All functions have a name of the kind pthread_*v The basic functions are
Ø pthread_equalØ pthread_selfØ pthread_createØ pthread_exitØ pthread_joinØ pthread_cancelØ pthread_detach
![Page 7: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/7.jpg)
Library and compilation
v The Pthread functions are defined in the header fileØ pthreads.h
v It's important to remember toØ Insert into the .c files the row
● #include <pthread.h>Ø Compile the programs using the option or
including the library pthread● gcc –Wall –g –o <exeName> –pthread <file.c>● gcc –Wall –g –o <exeName> <file.c> –lpthread
![Page 8: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/8.jpg)
Thread Identifier
v Every thread is identified by a univocal identifier similar to a process PID (pid_t)
v A thread identifier is of typ pthread_t Ø The identifier is opaque
● Its definition depends on the implementation● Can be accessed/used only through expressly
defined functions in Pthreads● It's not possible to directly compare two identifiers
or to pront their valueØ Has a meaning only inside the process in which
the thread has been executed (while the PID èglobal inside the system)
![Page 9: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/9.jpg)
System call pthread_equal ()
int pthread_equal ( pthread_t tid1, pthread_t tid2,);
v Compares two thread identifiersv Parameters
Ø Two thread identifiersv Return value
Ø Different from 0 if the threads are the sameØ Equal to 0 otherwise
![Page 10: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/10.jpg)
System call pthread_self ()
pthread_t pthread_self ( void);
v Return the thread idenfier of the calling threadv Can be used with pthread_equal to self-identify
a thread (e.g., so that the thread performs a correct access to its personal data)
![Page 11: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/11.jpg)
System call pthread_create ()
int pthread_create ( pthread_t *tid, const pthread_attr_t *attr, void *(*startRoutine)(void *), void *arg );
v At execution, every program includes only a single process and a single thread
v pthread_create generates a new threadØ The number of calls is undefined and depends on
the implemenation
![Page 12: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/12.jpg)
System call pthread_create ()
v ParametersØ Generated thread identifier (tid)Ø Thread's attributes (attr)
● NULL if is a default attributeØ C routine executed by the thread (startRoutine)
int pthread_create ( pthread_t *tid, const pthread_attr_t *attr, void *(*startRoutine)(void *), void *arg );
![Page 13: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/13.jpg)
System call pthread_create ()
Ø Argument (sinle) passed to the starting routine (arg)
● Use NULL if there's no argumentv Return value
Ø Value 0 if successfulØ An error code in case of failure
int pthread_create ( pthread_t *tid, const pthread_attr_t *attr, void *(*startRoutine)(void *), void *arg );
![Page 14: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/14.jpg)
System call pthread_exit ()
v A whole process (with all its threads) terminate ifØ One of its thread performs an exitØ The main performs a returnØ One of its thread receives a signal whose action is
to terminatev A single thread can terminate
Ø Performing a return from its starting function (the returned value is equal to the thread exit code)
Ø Receiving a pthread_cancel from another threadØ Executing a pthread_exit
![Page 15: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/15.jpg)
System call pthread_exit ()
int pthread_exit ( void *valuePtr);
v Allows a thread to terminatev Parameters
Ø The pointer without type (void * valuePtr) èis available to the thread that performs a pthread_join
v Return valueØ Value 0 if successfulØ An error code in case of failure
![Page 16: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/16.jpg)
System call pthread_join ()
v At creation a thread can be declaredØ Joinable
● Another thread can perform a "wait" (pthread_join) on it
Ø Detached● Its termination can't be waited explicitly (isn't
joinable)v A detached thread can't be joined
![Page 17: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/17.jpg)
System call pthread_join ()
v If the threadØ Is joinable its termination state is held until
another thread executed a pthread_join for that thread
Ø Is detached its termination state is immediately released
v The thread that calls the pthread_join remains blocked untile the requested thread performs a pthread_exit
![Page 18: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/18.jpg)
System call pthread_join ()
int pthread_join ( pthread_t tid, void **valuePtr);
v Used by a thread to wait on (wait) another specific thread
pthread_create()
Thread iniziale
Thread iniziale
Worker thread
pthread_join ()
pthread_exit ()
![Page 19: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/19.jpg)
System call pthread_join ()
int pthread_join ( pthread_t tid, void **valuePtr);
v ParametersØ Waited thread identifier (tid)Ø Pointer without type (void **valuePtr) to
● Returned value from the pthread_exit● The value PTHREAD_CANCELED if the thread has
been canceled
![Page 20: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/20.jpg)
System call pthread_join ()
int pthread_join ( pthread_t tid, void **valuePtr);
v Return valueØ Value 0 if successfulØ An error code in case of failure
● If the thread as born in the detached state the pthread_join can fail
● In this case it return the value EINVAL, but the behavior and the value depend on the implementation
![Page 21: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/21.jpg)
System call pthread_cancel ()
int pthread_cancel ( pthread_t tid);
v Termines the pointed thread (it's the same as if the thread executes a pthread_exit)
v ParametersØ Thread indentifier (tid)
v Return valueØ Value 0 if successfulØ An error code in case of failure
![Page 22: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/22.jpg)
System call pthread_detach ()
int pthread_detach ( pthread_t tid);
v Declares the thread tid as detached pointing out that it memory can be returned
v It's not possible to perform a join anymore with this thread
v Essentially future calls to pthread_join fails with en error code (EINVAL o ESRCH)
![Page 23: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/23.jpg)
System call pthread_detach ()
int pthread_detach ( pthread_t tid);
v ParametersØ Thread identifier (tid)
v Return valueØ Value 0 if suffessfulØ An error code in case of failure
![Page 24: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/24.jpg)
Exercise
v Realize with the function pthread_create and pthread_join the following precedence graph
A
F
C
D
B
G
E
![Page 25: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/25.jpg)
Solution
int random_time(int max){ return (int)(rand() % max) + 1;}
int main (void) { pthread_t th_cf, th_e; int *rt; void *retval; srand (getpid()); rt = (int *) malloc (sizeof (int)); *rt = random_time (10); sleep (*rt); printf ("A after %d seconds\n", *rt);
![Page 26: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/26.jpg)
Solution
*rt = random_time (10); pthread_create (&th_cf,NULL,CF,(void *)rt); *rt = random_time (5); sleep (*rt); printf ("B after %d seconds\n", *rt); *rt = random_time (10); pthread_create (&th_e,NULL,E,(void *)rt); *rt = random_time (5); sleep (*rt); printf ("D after %d seconds\n", *rt); pthread_join (th_cf, &retval); pthread_join (th_e, &retval); *rt = random_time (8); sleep (*rt); printf ("G after %d seconds\n", *rt); return 0;}
![Page 27: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/27.jpg)
Solution
static void *CF (void *arg) { int rt, *t = (int *) arg; sleep (*t); printf ( "C after %d seconds\n", *t); rt = random_time (2); sleep (rt); printf ( "F after %d seconds\n", *t); return 0;}static void *E (void *arg) { int *t = (int *) arg; sleep (*t); printf ( "E after %d seconds\n", *t); return 0;}
![Page 28: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/28.jpg)
Exercise
v Realize with the functions pthread_create and pthread_join the following precedence graph
A
E
C
B
I
F
D
H
G
![Page 29: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/29.jpg)
Exercise
v A file an undefined number of charactersv Realize a program with concurrent threads where
three threads (T1, T2, T3) work in pipeline to manage the fileØ T1: Reads from the file a character at a timeØ T2: Trasforms the character read by T1 in
uppercaseØ T3: Prints the character produced by T2 on
standard output
![Page 30: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/30.jpg)
Solution
static void *GET (void *arg) { char *c = (char *) arg; *c = fgetc (fg); return NULL;}static void *UPD (void *arg) { char *c = (char *) arg; *c = toupper (*c); return NULL;}static void *PRINT (void *arg) { char *c = (char *) arg; putchar (*c); return NULL;}
![Page 31: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/31.jpg)
Solution
FILE *fg;char next, this, last;
int main (int argc, char ** argv) { int retC; pthread_t tGet, tUpd, tPrint; void *retV; if ((fg = fopen(argv[1], "r")) == NULL){ perror ("Errore fopen\n"); exit (0); } this = ' '; last = ' '; next = ' ';
![Page 32: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/32.jpg)
Solution
while (next != EOF) { retC = pthread_create (&tGet,NULL,GET,&next); if (retC != 0) fprintf (stderr, ...); retC = pthread_create (&tUpd,NULL,UPD,&this); if (retC != 0) fprintf (stderr, ...); retC = pthread_create (&tPrint,NULL,PRINT,&last); if (retcode != 0) fprintf (stderr, ...); retC = pthread_join (tGet, &retV); if (retC != 0) fprintf (stderr, ...); retC = pthread_join (tUpd, &retV); if (retC != 0) fprintf (stderr, ...); retC = pthread_join (tPrint, &retV); if (retC != 0) fprintf (stderr, ...); last = this; this = next; }
![Page 33: Pthreads - polito.itPthreads v The library POSIX threads Ø POSIX 1003.1c from 1995 Ø Reviewd by the IEEE POSIX 1003.1 2004 Edition v or Pthreads is the standard UNIX library for](https://reader033.vdocument.in/reader033/viewer/2022051608/603e27e70c00ec14bc11f0f0/html5/thumbnails/33.jpg)
Solution
// Last two chars processing
retC = pthread_create(&tUpd,NULL,UPD,&this); if (retC!=0) fprintf (stderr, ...); retC = pthread_create(&tPrint,NULL,PRINT,&last); if (retC != 0) fprintf (stderr, ...); retC = pthread_join (tUpd, &retV); if (retC != 0) fprintf (stderr, ...); retC = pthread_join (tPrint, &retV); if (retC != 0) fprintf (stderr, ...); retC = pthread_create(&tPrint,NULL,PRINT,&this); if (retC != 0) fprintf (stderr, ...); return 0;}