next up previous contents index return to home!
Next: Un esempio Up: Multithreading Previous: Un Esempio: Meccanismi di   Indice   Indice analitico


Semafori classici

Per colmare questo vuoto lo standard Posix offre un nuovo tipo di dato, sem_t che è un'implementazione del classico meccanismo semaforico. Meccanismi analoghi potrebbero essere costruiti di volta in volta sfruttando le primitive e i tipi di dato già visti (è il caso dell'esempio 6.3.1) ma questo complicherebbe ogni volta la scrittura del programma. Si deve considerare questo tipo di dato, e le relative primitive associate, come un'utile scorciatoia offerta al programmatore.

Data la sua diversa natura non è stata prevista una macro di inizializzazione di un semaforo, per cui esso dovrà essere esplicitamente inizializzato con il valore voluto tramite la primitiva:



#include<semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);


Argomenti in ingresso :

sem
- Indirizzo del semaforo che si vuole inizializzare.
pshared
- Se posto a zero indica che il semaforo non è condiviso fra più processi, altrimenti indica che il semaforo deve essere condiviso fra più processi[*].
value
- Valore iniziale del semaforo.

Valore restituito :

0
- In caso di successo
-1
- In caso di insuccesso.

Dopo aver istanziato una variabile di tipo sem_t ed averla inizializzata con la primtiva appena vista potremo operare su di essa con le seguenti primitive :



#include<semaphore.h>

int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);


Argomenti in ingresso :

sem
- Indirizzo del semaforo su cui si vuole operare.

Valore restituito :

0
- In caso di successo
-1
- In caso di insuccesso.

Queste due funzioni rappresentano il modo classico di operare su dei semafori per cui non ci si dilungherà ulteriormente sul loro uso.

Per completezza riportiamo le seguenti primitive che operano sui semafori :



#include<semaphore.h>

int sem_trywait(sem_t *sem);


Tale primitiva è la versione non bloccante della sem_wait.

Argomenti in ingresso :

sem
- Indirizzo del semaforo su cui si vuole fare la wait non bloccante.

Lo standard Posix definisce anche una primitiva per potere leggere il valore attuale di un semaforo :



#include<semaphore.h>

int sem_getvalue(sem_t *sem, int *sval));


Argomenti in ingresso :

sem
- Indirizzo del semaforo di cui si vuole leggere il valore.
sval
- Puntatore all'intero in cui viene scritto il valore del semaforo.

Per entrambe le primitive vale quanto visto sopra riguardo al valore di ritorno.



Subsections
next up previous contents index
Next: Un esempio Up: Multithreading Previous: Un Esempio: Meccanismi di   Indice   Indice analitico
Giuseppe Lipari 2002-10-27