mercoledì 5 maggio 2010

Guida Objective-C in Italiano - I Threads - Parte 13


Siamo giunti alla tredicesima parte della Guida in Italiano alla programmazione in Objective-C, oggi parleremo brevemente dei Threads.

Questo post è una traduzione in italiano della Guida all'Objective C, presente sul sito developer.apple.com a questo link. L'Objective C è il linguaggio di programmazione per creare applicazioni per iPhone. Questo articolo può interessare a tutti gli sviluppatori che vogliono imparare le basi di questo linguaggio che è il fondamento per programmare nuove applicazioni per Mac Os X, iPhone ed iPad.


Threading

L'Objective-C fornisce supporto per la sincronizzazione dei thread e la gestione delle eccezioni. Per attivare il supporto per queste caratteristiche, usate l'interruttore -fobjc-exceptions di GNU Compiler Collection (GCC) versione 3.3 e successive.

Nota: Usando l'una o l'altra di queste caratteristiche in un programma, rende l'applicazione eseguibile solo in Mac OS X v10.3 e successivi poichè il supporto di runtime per la gestione delle eccezioni e la sincronizzazione non sono presenti in versioni precedenti del software.

Sincronizzare l'esecuzione dei Thread

L'Objective-C supportail multithreading nelle applicazioni. Questo vuol dire che i threads possono provare a modificare lo stesso oggetto allo stesso tempo, una situazione che può causare seri problemi in un programma. Per proteggere sezioni di codice dall'essere eseguite da più di un thread alla volta, l'Objective-C fornisce la direttiva @synchronized().

La direttiva @synchronized()chiude una sezione di codice per l'uso da un singolo thread. Gli altri threads sono bloccati finchè il thread esce dal codice protetto; che è, quando l'esecuzione continua dopo l'ultimo statement del blocco @synchronized().

La direttiva @sinchronized prende come suoi soli argomenti qualunque oggetto Objective-C incluso self. Quest'oggetto è conosciuto come semaforo di esclusione reciproca o mutex. Esso permette ad un thread di bloccare una sezione di codice per prevenirne l'uso da altri threads. Dovresti separare i semafori per proteggere diverse sezioni critiche di un programma. è più sicuro creare tutti oggetti mutuamente esclusivi prima che l'applicazione diventi multithreaded per evitare condizioni di competizione.

Il listato 12-1 mostra un esempio di codice che usa self come il mutex per sincronizzare l'accesso a metodi di istanza dell'oggetto corrente. Puoi prendere un approccio simile per sincronizzare i metodi di classe della classe associata, usando l'oggetto Class al posto di self. Nell'ultimo caso, ovviamente, solo un thread alla volta può eseguire un metodo di classe perchè c'è solo un oggetto di classe che è condiviso da tutti i chiamanti.

Listato 12-1 Bloccare un metodo usando self
- (void)criticalMethod

{

@synchronized(self) {

// Critical code.

...

}

}

Il listato 12-2 mostra un approccio generale. Prima di eseguire un processo critico, il codice ottiene un semaforo dalla classe Account e lo usa per chiudere sezioni critiche. La classe Account potrebbe creare il semaforo nel suo metodo initialize.

Listato 12-2 Bloccare un metodo usando un semaforo personalizzato
Account *account = [Account accountFromString:[accountField stringValue]];



// Get the semaphore.

id accountSemaphore = [Account semaphore];



@synchronized(accountSemaphore) {

// Critical code.

...

}

La caratteristica di sincronizzazione dell'Objective-C supporta codice ricorsivo e rientrante. Un thread può usare un singolo semaforo molte volte, in una maniera ricorsiva; altri threads sono bloccati dall'uso del semaforo finché il thread rilascia tutte le parti di codice bloccate ottenute da lui; che sarebbe, quando ogni blocco @synchronized() termina normalmente o tramite un'eccezione.

Quando il codice in un blocco @synchronized() lancia un'eccezione, il runtime cattura l'eccezione, rilascia il semaforo (così che il codice protetto possa essere eseguito da altri threads), e ri-lancia l'eccezione al prossimo gestore di eventi.

Fine Parte 13

Finisce qui il tredicesimo articolo di questa Guida dedicato al Threading. Siamo ormai quasi alla fine, e il prossimo post tratterà i messaggi remoti.

Segnalatemi eventuali errori, o commentate l'articolo se l'avete trovato utile, anche per incentivarmi a continuare a pubblicare le mie traduzioni. Iscrivetevi ai feed del blog per essere sempre aggiornati automaticamente ogni volta che sono disponibili nuovi contenuti.
Nella barra laterale del blog potete trovare l'elenco di tutti gli articoli di questa guida.

Nessun commento:

Posta un commento

Related Posts with Thumbnails