tudo pronto
[3hU9fRjo95.git] / pc_channel_multi.go~
blob6d9c6c88cdb7201ffabcdce75e408cdf44fbbe7c
1 /* pc_channel_multi.go */
3 package main
5 import (
6         . "fmt"
7         "crypto/rand"
8         "time"
9         "flag"
12 func random_between (begin, end int64) int64 {
13         random_byte := make([]byte, 1)
14         rand.Read(random_byte)
15         return int64(random_byte[0]) % (end - begin + 1) + begin
18 func random_sleep () {
19         time.Sleep(random_between(0, *MAX_SLEEP_TIME) * 10e7)
22 func send (channel chan int, i int) {
23         channel <- i
26 func recv (channel chan int) int {
27         return <-channel
30 func signal (channel chan int) {
31         if len(channel) < cap(channel) || cap(channel) == 0 {
32                 channel <- 0
33         }
36 func wait (channel chan int) {
37         <-channel
40 var (
41         BUFFER_SIZE = flag.Int("s", 5, "BUFFER_SIZE") // flag -s
42         MAX_SLEEP_TIME = flag.Int64("t", 5, "MAX_SLEEP_TIME") // flag -t
43         MAX_PRODUCTIONS = flag.Int("m", 0, "MAX_PRODUCTIONS, 0 for infinity") // flag -m
44         N_PRODUCERS = flag.Int("p", 3, "N_PRODUCERS") // flag -p
45         N_CONSUMERS = flag.Int("c", 3, "N_CONSUMERS") // flag -c
46         pipe = make(chan int, *BUFFER_SIZE)
47         quit    = make(chan int)
50 func producer (id int) {
51         for i := 0; i < *MAX_PRODUCTIONS || *MAX_PRODUCTIONS == 0; i++ {
52                 Println(id, "producing:", i + id * 1e5)
53                 send(pipe, i + id * 1e5)
54                 random_sleep()
55         }
56         signal(quit)
59 func consumer (id int) {
60         for {
61                 v := recv(pipe)
62                 if closed(pipe) {
63                         break
64                 }
65                 Println("\t\t\t", id, "consuming:", v)
66                 random_sleep()
67         }
68         signal(quit)
71 func main () {
72         flag.Parse() // processa flags
73         Println("BUFFER_SIZE =", *BUFFER_SIZE)
74         Println("MAX_SLEEP_TIME =", *MAX_SLEEP_TIME)
75         Println("MAX_PRODUCTIONS =", *MAX_PRODUCTIONS)
76         Println("N_PRODUCERS =", *N_PRODUCERS)
77         Println("N_CONSUMERS =", *N_CONSUMERS)
78         for i := 0; i < *N_PRODUCERS; i++ { // cria produtores
79                 go producer(i + 1)
80         }
81         for i := 0; i < *N_CONSUMERS; i++ { // cria consumidores
82                 go consumer(i + 1)
83         }
84         for i := 0; i < *N_PRODUCERS; i++ { // espera o término dos produtores
85                 wait(quit)
86         }
87         close(pipe)     // fecha comunicação
88         for i := 0; i < *N_CONSUMERS; i++ {     // espera o término dos consumidores
89                 wait(quit)
90         }