Ruby – Thread II

r3

Deadlock (blocco)

Quando si usa Mutex bisogna prestare attenzione a evitare i blocchi di sistema, deadlocks. Questo capita quando tutti i thread sono in attesa per acquisire una risorsa bloccata da un altro thread.
A questo punto entrano in gioco le condition variables. Una condition variable è un semaforo associata a una risorsa a protezione di un mutex.
Quando necessiti di una risorsa non disponibile aspetti in una condition variable; quando un thead segnala che la risorsa è disponibile il thread che l’ha emessa esce dall’attesa e blocca la risorsa. Suona complicato? No, ecco un esempio (dlth.rb):

#!/usr/bin/ruby
# encoding: UTF-8

#  dlth.rb

require 'thread'
mutex = Mutex.new

cv = ConditionVariable.new
a = Thread.new {
   mutex.synchronize {
      puts "A: I have critical section, but will wait for cv"
      cv.wait(mutex)
      puts "A: I have critical section again! I rule!"
   }
}

puts "(Later, back at the ranch...)"

b = Thread.new {
   mutex.synchronize {
      puts "B: Now I am critical, but am done with cv"
      cv.signal
      puts "B: I am still critical, finishing up"
   }
}

a.join
b.join

dlth

Eccezioni di thread

Quando si verifica un’eccezione non gestita il programma termina. Vediamo cosa succede al verificarsi du un’eccezione all’interno di un thread (exth.rb):

#!/usr/bin/ruby
# encoding: UTF-8

#  exth.rb

require 'thread'
Thread.abort_on_exception = true

t = Thread.new do
    i = 4
    while i >= -1
        j = 24 / i
        puts j
        i -= 1
    end
end

sleep(10)
puts "Program completed"

exth

OK, al verificarsi dell’errore il programma abortisce. Modifichiamo la condizione di gestione dell’eccezione, riga 7 (exth1.rb):

#!/usr/bin/ruby
# encoding: UTF-8

#  exth.rb

require 'thread'
Thread.abort_on_exception = false # = -1
        j = 24 / i
        puts j
        i -= 1
    end
end

sleep(10)
puts "Program completed"

exth1

Come si vede in questo caso l’eccezione nel thread permette la continuazione del programma.

I thread hanno diversi altri metodi per gestire loe eccezioni, oltre a quella vista sopra. Sono peraltro riservate a un corso più approfondito 😉

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: