I semafori mutex





Per creare un semaforo mutex si deve chiamare la funzione CreateMutex

CreateMutex
HANDLE CreateMutex   
   LPSECURITY_ATTRIBUTES
    lpMutexAttributes, 

   BOOL                     bInitialOwner, 

   LPCTSTR                  lpName

      }


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: 


WaitForSingleObject
DWORD WaitForSingleObject   
   HANDLE
       hHandle

     DWORD        dwMilliseconds 

La funzione restituisce i seguenti valori:
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.