Threads, Mutex e Semafori in C – La programmazione concorrente

Categorie: Informatica
Tag: Nessun tag
Commenti: Nessun Commento
Pubblicato il: 2 luglio 2009

Threads!Ebbene si, sono tornato a studiare.

Dopo il tormento elettrotecnica, si passa a sistemi operativi, una materia molto bella ma molto ostica, che mi “costringerà” nel poco tempo che ho a disposizione, a studiare la programmazione concorrente in C.

Chiunque mi conosca un minimo, sia tramite il mio blog che di presenza, sa che non sono un eccellente programmatore, specialmente in C, anche se mi piace abbastanza programmare, quando mi ci metto.

Tempo fa parlai di alberi binari, adesso parliamo di thread.

Un thread è la più piccola unità di utilizzo della CPU, contenuta all’interno di un processo, che può agire contemporaneamente ad altri thread, chiamati appunto concorrenti.

Un linguaggio di programmazione che fa uso di threads, è detto concorrente.

Non scendo al momento nel dettaglio sul perchè i threads siano utili e a cosa servano.. vediamo qualche semplice esempio di listati sui threads, ovvero come crearli, joinarli e distruggerli, ma soprattutto, come farli cooperare.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include
#include
 
void *funzionebanale1(void * arg)
{
printf ("Thread numero 1 in azionen");
pthread_exit (0);
}
void *funzionebanale2(void * arg)
{
printf ("Thread numero 2 in azionen");
pthread_exit (0);
}
 
int main(void * args)
{
pthread_t tid1, tid2;
pthread_create(&tid1,NULL,funzionebanale1,NULL);
pthread_create(&tid2,NULL,funzionebanale2,NULL);
pthread_join (tid1, NULL);
printf("terminato il thread 1n");
pthread_join (tid2, NULL);
printf("terminato il thread 2n");
return 0;
}

Vediamo di esaminare un pò questo listato.

La prima parte, gli include, sono più che noti a chi ha un minimo di dimestichezza con il linguaggio C, andiamo quindi immediatamente alla parte successiva.

Quello che vediamo sono due funzioni molto semplici (non per niente chiamate funzionibanali) che restituiscono un puntatore a void, e che accettano un puntatore a void come argomento.

Le funzioni si limitano a stampare a video una scritta con una semplice printf e a richiamare una funzione, chiamata pthread_exit con parametro 0, che permette di chiudere un thread senza rilasciare errori.

Andiamo quindi al main.

Un thread va INIZIALIZZATO come una qualsiasi variabile, in questo caso il tipo è pthread_t, per cui creiamo due threads, chiamandoli tid1 e tid2.

A questo punto possiamo effettivamente creare il thread vero e proprio, utilizzando la funzione pthread_create

La funzione pthread_create accetta quattro argomenti, il primo è un riferimento alla variabile pthread_t su cui si lavora, il secondo è invece un riferimento ad una variabile di tipo pthread_attr_t che identifica gli attributi che deve avere il thread. Impostando tale secondo attributo a NULL, si utilizzeranno i valori di default, caso abbastanza classico.

Il terzo attributo rappresenta un puntatore alla funzione che contiene il codice che deve eseguire il thread.

Il quarto attributo rappresenta l’attbuto che viene passato alla funzione precedentemente puntata. Se la funzione può anche non accettare argomenti, si può impostare un simpatico NULL.

Una volta creati i due thread, occorre joinare.

La funzione pthread_join sospende l’esecuzione del thread chiamante fintantochè non è completato il codice del thread chiamato. La funzione accetta come argomenti un thread e un puntatore doppio, nella quale variabile puntata sarà inserito il valore di ritorno del thread chiamato.


Condividilo
Nessun Commento - Lascia un commento

Lascia un commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">


Benvenuto , oggi è sabato, 11 febbraio 2012