PROGRAMMAZIONE MULTITHREADING

 

 

 

Ogni SO fornisce al programmatore una libreria di funzioni che permettono ad un’applicazione utente di utilizzare le risorse messe a disposizione dal sistema operativo. Questa libreria  è denominato  API (Application Program Interface ).

Una parte importante dell’API è costituita da quelle  funzioni che permettono di creare  threads all’interno di un programma.

Prima di illustrare i passi necessari per creare un thread occorre premettere alcune considerazioni.

Un thread è visto da Windows come un “oggetto” facente parte dell’insieme dei cosiddetti oggetti kernel. Gli oggetti kernel sono i processi, i thread, e tutti gli oggetti  che gestiscono la comunizazione e la sincronizzazione fra processi o threads.

Un thread si può trovare in due stati: segnalato e non segnalato. Il thread è segnalato se ha terminato, cioè se la funzione che implementa il codice del thread ha effettuato l’istruzione return, non segnalato se è ancora in esecuzione.

Un thread presenta le seguenti importanti proprietà

 Per creare uno o più threads  occorre:

  1. Scrivere una funzione che contiene il codice di ciascun thread deve  eseguire

  2. Creare il thread con la funzione CreateThread

  3. Attendere, chiamando una funzione specifica, la terminazione del thread (cioè che il thread sia segnalato)

  4. Chiudere il thread con la funzione CloseHandle  

La  funzione che implementa il codice del thread deve avere la seguente intestazione :

DWORD WINAPI  nome_funzione(LPVOID  lpParam){

       /* istruzioni */

return (0) ;

}

Per creare un thread si chiama la funzione CreateThread   

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId

);

In caso di successo la funzione ritorna l’handle del thread. Diversamente ritorna NULL

                        DWORD ResumeThread(

                            HANDLE hHandle,

                        );

 

 

La funzione decrementa un conteggio di sospensione del thread . Se il conteggio va a 0 viene rispristinata la sua esecuzione.

Restituisce il conteggio del thread sospeso. 

Le funzioni che attendono la terminazione dei threads sono due WaitForSingleObject e WaitForMultipleObjects

La funzione WaitForSingleObject  attende che si verifichi uno di questi eventi: 

                          

                        DWORD WaitForSingleObject(

                            HANDLE hHandle,

                            DWORD dwMilliseconds

                        );  

 La funzione restituisce  i seguenti valori: 

La funzione WaitForMultipleObjects attende che si verifichi uno dei seguenti eventi::

                       

  

                       DWORD WaitForMultipleObjects(

                                   DWORD nCount,

                                   CONST HANDLE  *lpHandles,

                                   BOOL bWaitAll,

                                   DWORD dwMilliseconds

                        };

 

La funzione  restituisce i seguenti valori :

 

La funzione CloseHandle chiude l’handle del thread, decrementando il contatore d’uso di 1.  Questo non comporta necessariamente la deallocazione del thread. Il thread viene deallocato solo se  ha terminato e  il suo contatore d’uso è andato a 0.

 

 

                    BOOL CloseHandle(HANDLE hobject)

              

La funzione restituisce TRUE se tutto è andato bene.