Advertisement
Guest User

Untitled

a guest
Jun 30th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Main where
  2. import Control.Concurrent
  3. import Control.Concurrent.MVar
  4.  
  5. await :: MVar Int -> MVar Int-> IO()
  6. await mvar fim =
  7.     do{
  8.         var <- takeMVar mvar;
  9.         if(var==0)
  10.             then do
  11.                 aux <- takeMVar fim;
  12.                 putMVar fim (aux-1);
  13.                 return();
  14.             else
  15.                 putMVar mvar var;
  16.                 await mvar fim;
  17. }
  18.  
  19. countDown :: MVar Int -> MVar Int-> IO()
  20. countDown mvar fim =
  21.     do{
  22.        var <- takeMVar mvar;
  23.        putMVar mvar (var-1);
  24.        aux <- takeMVar fim;
  25.        putMVar fim (aux-1);
  26. }
  27.  
  28. waitThread :: MVar Int -> IO()
  29. waitThread mvar =
  30.     do{
  31.        fim <- takeMVar mvar;
  32.        if(fim>0)
  33.             then do{
  34.                 putMVar mvar fim;
  35.                 waitThread mvar;
  36.             }
  37.         else
  38.             return ();
  39. }
  40.  
  41. main :: IO()
  42. main = do{
  43.     fim <- newMVar 10;
  44.     var <- newMVar 5;
  45.     forkIO(await var fim);
  46.     forkIO(await var fim);
  47.     forkIO(await var fim);
  48.     forkIO(countDown var fim);
  49.     forkIO(countDown var fim);
  50.     forkIO(countDown var fim);
  51.     forkIO(await var fim);
  52.     forkIO(countDown var fim);
  53.     forkIO(countDown var fim);
  54.     forkIO(await var fim);
  55.     waitThread fim;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement