Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main where
- import Control.Concurrent
- import Control.Concurrent.MVar
- await :: MVar Int -> MVar Int-> IO()
- await mvar fim =
- do{
- var <- takeMVar mvar;
- if(var==0)
- then do
- aux <- takeMVar fim;
- putMVar fim (aux-1);
- return();
- else
- putMVar mvar var;
- await mvar fim;
- }
- countDown :: MVar Int -> MVar Int-> IO()
- countDown mvar fim =
- do{
- var <- takeMVar mvar;
- putMVar mvar (var-1);
- aux <- takeMVar fim;
- putMVar fim (aux-1);
- }
- waitThread :: MVar Int -> IO()
- waitThread mvar =
- do{
- fim <- takeMVar mvar;
- if(fim>0)
- then do{
- putMVar mvar fim;
- waitThread mvar;
- }
- else
- return ();
- }
- main :: IO()
- main = do{
- fim <- newMVar 10;
- var <- newMVar 5;
- forkIO(await var fim);
- forkIO(await var fim);
- forkIO(await var fim);
- forkIO(countDown var fim);
- forkIO(countDown var fim);
- forkIO(countDown var fim);
- forkIO(await var fim);
- forkIO(countDown var fim);
- forkIO(countDown var fim);
- forkIO(await var fim);
- waitThread fim;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement