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:

  1. 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.

  1. 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.

  1. Il thread child termina con una pthread_exit.

Riferimenti