-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfabricaParafusos2.hs
97 lines (87 loc) · 2.85 KB
/
fabricaParafusos2.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
module Main where
import Control.Concurrent
import Control.Concurrent.MVar
waitThreads :: MVar Int -> IO ()
waitThreads fim =
do f <- takeMVar fim
if (f > 0) then
do putMVar fim f
waitThreads fim
else
return ()
fabricaParafusos :: MVar Int -> MVar Int -> IO ()
fabricaParafusos paraf fim
= do
f <- takeMVar fim
p <- takeMVar paraf
putStrLn ("fParaf - num paraf: " ++ show(p+1))
putStrLn ("fParaf - fim: " ++ show(f-1))
putMVar paraf (p + 1)
putMVar fim (f-1)
fabricaParafusos paraf fim
fabricaPorcas :: MVar Int -> MVar Int -> IO ()
fabricaPorcas porcas fim
= do
p <- takeMVar porcas
f <- takeMVar fim
--putMVar porcas (p + 1)
putStrLn ("fPorca - valor de fim: " ++ show(f-1))
putStrLn ("fPorca - num inicial de porcas: "++ show(p))
putStrLn ("fPorca - num de final de porcas: " ++ show(p+1))
putMVar fim (f-1)
putMVar porcas (p + 1)
fabricaPorcas porcas fim
montador:: String -> MVar Int -> MVar Int -> MVar Int -> MVar Int -> IO ()
montador id porcas paraf pares fim
= do
pr <- takeMVar pares
pc <- takeMVar porcas
pf <- takeMVar paraf
f <- takeMVar fim
if pc > 1 && pf > 1
then do
putStrLn(id ++ " pares")
putStrLn(id ++ " porcas")
putStrLn(id ++ " parafusos")
putStrLn (id ++ "pares: " ++ show(pr+1))
putStrLn(id ++ ": valor de fim:" ++ show(f-1))
putStrLn(id ++ ": terminando mais um par")
putMVar pares (pr + 1)
putMVar paraf (pf - 1)
putMVar porcas (pc - 1)
putMVar fim (f-1)
montador id porcas paraf pares fim
else
do putMVar pares pr
putMVar paraf pf
putMVar porcas pc
putMVar fim f
montador id porcas paraf pares fim
main :: IO ()
main = do
fim1 <- newMVar 8
fim2 <- newMVar 4
-- fim3 <- newMVar 25
-- fim4 <- newMVar 25
porcas <- newMVar 0
parafusos <- newMVar 0
pares <- newMVar 0
mut <- newMVar 0
forkIO (fabricaParafusos parafusos fim1)
forkIO (fabricaPorcas porcas fim1)
forkIO (montador "maq1" porcas parafusos pares fim2)
forkIO (montador "maq2" porcas parafusos pares fim2)
waitThreads fim1
waitThreads fim2
-- waitThreads fim3
-- waitThreads fim4
pr <- takeMVar pares
putMVar pares pr
pc <- takeMVar porcas
putMVar porcas pc
pf <- takeMVar parafusos
putMVar parafusos pf
putStrLn ("porcas: " ++ show(pc))
putStrLn ("parafusos: " ++ show(pf))
putStrLn ("pares: " ++ show(pr))
return ()