Requisiti per poter utilizzare i Pthread :
- includere
pthread.h - utilizzare il flag
-pthreadquando compiliamo con gcc (es.gcc -pthread main.c -o main)
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> // hereQuando 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 *) (NULLse 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_createepthread_joinritornato 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 ilreturn, siccome prende come parametro unvoid*.
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;
}