\begin{slide}{Datentransport durch Kanäle}

\begin{itemize}
\item
häufig gibt es eine Trennung:
\begin{itemize}
\item Prozesse erzeugen Daten (producer)
\item Prozesse verbrauchen Daten (consumer)
\end{itemize}
\item
Verbindung durch eine Kanal (vgl. Unix: Pipe)
\item
beschränkte Kapazität des Kanals führt auch zu Synchronisation
(producer blockiert, wenn Kanal voll ist)
\item
  mehrere producer können Kanal nach Bedarf nutzen
\end{itemize}

\end{slide}

\begin{slide}{Kanäle (Beispiel)}

\begin{verbatim}
collector <- newChan 
let m = 10
sequence $ do
    d <- [ 0 .. m - 1 ]
    return $ forkIO $ do
        let p = sum [ d , d + m .. n ]
        writeChan collector p
xs <- sequence $ replicate ( fromIntegral m ) 
               $ readChan collector
print $ sum xs
\end{verbatim}



\begin{small}
\verb|ghc -smp --make Foo -o Foo; ./Foo +RTS -N2| \\
\verb|http://hackage.haskell.org/trac/ghc/wiki/GhcConcurrency| \\
\verb|http://pugs.blogs.com/pugs/2006/10/smp_paralleliza.html|
\end{small}

\end{slide}




%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
