detalhes finais do relatorio
[3hU9fRjo95.git] / pc_channel_multi.go
blob0bf5a29962dae4400c7ee018dc55c367fb98fb9f
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
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()
56 signal(quit)
59 func consumer (id int) {
60 for {
61 v := recv(pipe)
62 if closed(pipe) { // canal fechado?
63 break
65 Println("\t\t\t", id, "consuming:", v)
66 random_sleep()
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)
81 for i := 0; i < *N_CONSUMERS; i++ { // cria consumidores
82 go consumer(i + 1)
84 for i := 0; i < *N_PRODUCERS; i++ { // espera o término dos produtores
85 wait(quit)
87 close(pipe) // fecha comunicação
88 for i := 0; i < *N_CONSUMERS; i++ { // espera o término dos consumidores
89 wait(quit)