Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Concurrencia en LF
Concurrencia en LF
CONCURRENTE EN LENGUAJES
FUNCIONALES:
CONCURRENT HASKELL
NDICE
1. INTRODUCCIN
1.1 Motivacin y Orgenes
1.2 Concurrencia y lenguajes funcionales
2. CONCURRENT HASKELL
2.1 Procesos
2.2 Sincronizacin y comunicacin
2.3 Semforos
2.4 Otras operaciones concurrentes
2.5 Productor/consumidor
2.6 Canales
3. CONCLUSIONES
4. REFERENCIAS
1. INTRODUCCIN
a la propiedad de confluencia
(podemos encontrar dos secuencias de
evaluacin diferentes que parten del mismo
dato de entrada), los lenguajes funcionales
pueden utilizar directamente el paralelismo
implcito. Otra opcin es aadir al lenguaje
ciertas extensiones para especificar la
concurrencia, como es el caso que vamos a
estudiar.
5
2. CONCURRENT HASKELL
Concurrent
2.1 Procesos
Ejemplo1:
import Control.Concurrent
main = forkIO (escribir 'a') >> escribir 'b'
where escribir c = putChar c >> escribir c
10
caractersticas de forkIO :
2.2 Sincronizacin y
comunicacin
Los
12
Type MVar a
MVar
El tipo MVar puede ser usado de tres maneras
diferentes:
Puede ser usado como una versin sncronizada del
tipo MutVar.
Puede ser empleado como un tipo de canal, donde
takeMVar y PutMVar funcionan como recibir y
enviar.
El MVar puede ser usado como un semforo
binario, donde los signal y los waits son
implementados con putMVar y takeMVar
respectivamente.
14
2.3 Semforos
Aunque se puede implementar con un MVar usando
las operaciones putMVar y takeMVar, los semforos
tambien estn implementados en Concurrent
Haskell.
Semforo binario:
data QSem
newQSem :: Int -> IO QSem
waitQSem :: QSem -> IO ()
signalQSem :: QSem -> IO ()
15
2.3 Semforos
Semforos de cantidad general:
data QSemN
newQSemN :: Int -> IO QSemN
waitQSemN :: QSemN -> Int -> IO ()
signalQSemN :: QSemN -> Int -> IO ()
16
2.5 Productor/consumidor
Productor consumidor
type CVar a = (MVar a,
MVar ())
-- Productor-> consumidor
-- Consumidor -> productor
newCVar :: IO (CVar a)
newCVar = newMVar >>= \ data_var ->
newMVar
>>= \ ack_var ->
putMVar ack_var () >> return (data_var, ack_var)
putCVar :: CVar a -> a -> IO ()
putCVar (data_var,ack_var) val= takeMVar ack_var >> putMVar
data_var val
getCVar :: CVar a -> IO a
getCVar (data_var,ack_var) = takeMVar data_var
putMVar ack_var ()
>> return val
2.6 Canales
El
Canales
Usando MVars podemos definir un nuevo tipo que
llamaremos canal que permitir que mltiples
procesos escriban y lean de l de forma segura.
type Channel a = (MVar (Stream a), -- ltimo ledo
MVar (Stream a)) -- ltimo escrito
newChan :: IO (Channel a)
putChan :: Channel a -> a -> IO
getChan :: Channel a -> IO a
21
Canales
22
24
25
26
getChan (read,write)
= do { head_var <- takeMVar read ;
MkItem val new_head <- takeMVar head_var ;
putMVar read new_head ;
return val }
27
canal multicast
Implementacin de canales en
Concurrent Haskell
data Chan a
newChan :: IO (Chan a)
-- Nuevo canal
writeChan :: Chan a -> a -> IO () --Escribe dato en canal
readChan :: Chan a -> IO a
--Lee un dato del canal
dupChan :: Chan a -> IO (Chan a) --Duplica el canal
unGetChan :: Chan a -> a -> IO () --Devuelve un dato al canal
isEmptyChan :: Chan a -> IO Bool --Comprueba si est vaco
getChanContents :: Chan a -> IO [a] -- lee todo el contenido
writeList2Chan :: Chan a -> [a] -> IO () -- Escribe el contenido
de una lista en el canal
29
3. CONCLUSIONES
4. REFERENCIAS
http://www.haskell.org
Ruz, B.C.; Gutirrez, F.; Guerrero, P.; Gallardo, J.E.: Razonando con
Haskell. Una introduccin a la Programacin Funcional. Servicio
reprogr. (OC) E.T.S.I.I., Universidad de Mlaga. 2000
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control.Concu
rrent.html
Tackling the Awkward Squad: monadic input/output, concurrency,
exceptions, and foreign-language calls in Haskell
Simon PEYTON JONES Microsoft Research, Cambridge
simonpj@microsoft.com
http://research.microsoft.com/users/simonpj
Concurrent Haskell
Simon Peyton Jones (University of Glasgow)
Andrew Gordon (University of Cambridge)
Sigbjorn Finne (University of Glasgow)
Notas para la asignatura Programacin Declarativa Avanzada.
Blas Carlos Ruiz Jimnez
31