I semafori mutex
Per creare un semaforo mutex si deve chiamare la funzione
CreateMutex
CreateMutex |
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES
lpMutexAttributes,
BOOL
bInitialOwner,
LPCTSTR
lpName
} |
- lpMutexAttributes
- puntatore agli attributi di sicurezza. Mettete a NULL
- bInitialOwner
- TRUE:Il mutex viene creato nello stato "occupato" ( "non
segnalato" nella terminologia Windows). In questo caso, nessun
processo (thread) può accedere al mutex prima che questo venga posto
esplicitamente nello stato di "libero"
("segnalato" nella terminologia Windows) dal procersso
o thread che lo ha creato
- FALSE: Il semaforo viene creato nello stato "libero"
- lpName
- Se vogliamo che il mutex venga usato da altri processi dobbiamo
assegnare ad esso un nome che verrà memorizzato in una cartella di
sistema e con cui gli altri processi identificheranno il mutex. Diversamente, porre a
NULL.
Ricordiamo che i
processi occupano aree di memoria distinte e protette, per cui non c'è modo di
far condividere variabili o oggetti senza far intervenire specificatamente il
SO. la funzione CreateMutex viene utilizzata anche per chiamere un
semaforo esistente, creato da un altro processo.
Un processo o thread che deve accedere ad una risorsa controllata dal mutex deve
chiamare WaitForSingleObject
La funzione WaitForSingleObject
attende che si verifichi uno di questi eventi:
-
Il mutex segnala
libero
-
E’ scaduto
uno specificato timeout impostato del programmatore
WaitForSingleObject |
DWORD WaitForSingleObject(
HANDLE
hHandle,
DWORD dwMilliseconds
|
-
hHandle
-
L’handle
del mutex restituito da CreateMutex
-
dwMilliseconds
-
Specifica
un tempo di attesa, in msec, scaduto il quale la funzione ritorna anche
se il mutex continua a segnalare occupato. Se si pone uguale a INFINITE,
la funzione ritorna solo se il mutex segnala libero
La funzione restituisce i seguenti valori:
- WAIT_OBJECT0: Il mutex è segnalato (risorsa disponibile)
- WAIT_TIMEOUT: è scaduto lo specifico timeout
- WAIT_ABANDONED: il mutex è non segnalato (risorsa non
disponibile), ma il processo (thread) che ha creato il mutex è terminato
prima di rilasciare il mutex.
Quando il processo (thread) ha finito di utilizzare la risorsa deve chiamare ReleaseMutex
che porrà il mutex nello stato di "libero"
ReleaseMutex |
BOOL ReleaseMutex
{
HANDLE hMutex,
} |
Esempio: il processo chiama o crea il semaforo "miosem"
#include
<windows.h>
HANDLE
hmutex,hthread;
void
main(){
hmutex
= CreateMutex(NULL, false, "miosem");
WaitForSingleObject(hmutex,INFINITE);
<uso la risorsa>
CloseHandle(hmutex);
}
|
La funzione CloseHandle chiude l’handle del mutex, decrementando il contatore d’uso di 1.
Questo non comporta necessariamente la deallocazione dalla memoria
del mutex. Il mutex viene deallocato solo se il suo contatore d’uso è andato a 0. Questo comportamento
è tipico di tutti gli oggetti kernel.
Per chiudere un mutex si usa la funzione CloseHandle
CloseHandle |
BOOL CloseHandle
{
HANDLE hObject
} |
La funzione restituisce TRUE se tutto è andato bene.