PFEW - FEW basato su posix threads¶
1#include <unistd.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/wait.h>
5
6#include <pthread.h>
7
8void* child_func(void *par){
9 *((int*)par) = 1;
10 sleep(5);
11 printf("I'm the child!\n");
12 pthread_exit(par);
13}
14
15int main(){
16 pthread_t ctid;
17 int res, *status_ptr, status_val;
18 status_ptr = &status_val;
19 printf("I'm a thread. I'm going to create another thread\n");
20 res = pthread_create(&ctid, NULL, child_func, &status_val);
21 if(res != 0) printf("I cannot create a child");
22 else{
23 printf("I'm now a parent thread. "
24 "I'll wait for my child %lu thread to die...\n", ctid);
25 pthread_join(ctid, (void**)&status_ptr);
26 printf("My child has invoked %d\n", *status_ptr);
27 }
28 printf("My child is dead, so it's my time to die\n");
29 return 0;
30}
Pthread FEW (PFEW ) è un semplice programma C per emulare il comportamento del programma FEW, ma utilizzando i thread al posto di processi.
Di conseguenza PFEW:
Creare un thread tramite pthread_create.
Observation
A differenza della fork, la pthread_create
richiede come terzo parametro la funzione che il thread child deve eseguire.
Tale funzione riceve un parametro che corrisponde all’ultimo (quarto) paramentro di invocazione
della pthread_create.
Il primo parametro invece è un puntatore ad un’area di memoria dove il parent thread può accedere per ottenere
il pthread_t
, ossia il thread id, caratteristico del thread child.
Infine, il secondo parametro è un puntatore ad una struttura dati di tipo pthread_attr_t
, opportunamente inizializzata da
un’invocazione a pthread_attr_init, attraverso la quale è possibile
configurare alcune proprietà del thread child, tra cui:
dimensione minima e posizione dello stack per il thread child;
scheduling policy e priorità del thread child.
Attendere la terminazione del thread child tramite pthread_join.
Observation
A differenza di quanto accade per i processi con la funzione wait, per i posix thread non esiste una funzione per aspettare un generico thread child. La funzione pthread_join infatti richiede l’id del thread da attendere come primo paramentro. Il secondo parametro invece è utilizzato per ricevere un payload generato dal thread child atteso. Nel caso dei processi, un comportamento simile è ottenibile grazie alla funzione waitpid.
Il thread child termina con una pthread_exit.