Requisiti per poter utilizzare i Pthread :

  • includere pthread.h
  • utilizzare il flag -pthread quando compiliamo con gcc (es. gcc -pthread main.c -o main)
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>  // here

Quando creiamo un thread dobbiamo passargli il puntatore ad una funzione e il thread la eseguirà, quindi iniziamo a creare una funzione di esempio :

 
void* my_function(void *tid){
	printf("[+] Test test from thread number %d\n", );
}

Per creare un thread dobbiamo prima definirlo con il tipo pthread_t (dove memorizza le info del thread) :

int main(int argc, char* argv[]){
	pthread_t t1;
	return 0;
}

Ora possiamo creare il thread con pthread_create passandogli vari parametri :

  • puntatore alla variabile di tipo pthread_t (&t1)
  • attributi del thread (per personalizzazione), va bene anche NULL
  • puntatore alla funzione (&my_function)
  • parametri per la funzione passata (solo di tipo generico : void * ) (NULL se non ce ne sono) ((void *)thread_id)
int thread_id = 1234;
pthread_create(&t1, NULL, &my_function, (void *) thread_id);

Una cosa necessaria da fare è quella di “aspettare” che il thread finisca, e lo facciamo con pthread_join e passiamo :

  • struct del thread (t1)
  • puntatore che prende il risultato ritornato da quel thread, va bene anche NULL
pthread_join(t1, NULL);

Ricordiamo che pthread_create e pthread_join ritornato dei valori di stato (int), quindi è possibile anche fare dei check per eventuali errori.

Nella funzione che passiamo possiamo far terminare il thread con pthread_exit(NULL), questa chiamata permette anche di sostituire il return, siccome prende come parametro un void*.

codice completo :

#include <pthread.h> // here
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void *my_function(void *tid) {
  printf("[+] Test test from thread number %d\n", tid);
  
  pthread_exit(NULL);
}
 
int main(int argc, char *argv[]) {
  pthread_t t1;
  int thread_id = 1234;
  pthread_create(&t1, NULL, &my_function, (int *)thread_id);
  pthread_join(t1, NULL);
  return 0;
}