tudo pronto
[3hU9fRjo95.git] / pc_channel.go~
blob99e1373dd5e97a110248b7be749eab8a9203c1bc
1 /* pc_channel */
3 package main
5 import (
6         . "fmt"
7         "crypto/rand"
8         "time"
11 // gera um número inteiro aleatório no intervalo [begin, end]
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 // dorme durante um intervalo de tempo aleatório
19 func random_sleep () {
20         time.Sleep(random_between(0, MAX_SLEEP_TIME) * 10e7)
23 // envia o inteiro i através do canal channel
24 func send (channel chan int, i int) {
25         channel <- i
28 // recebe um inteiro através do canal channel e o retorna
29 func recv (channel chan int) int {
30         return <-channel
33 // envia um valor qualquer para o canal channel
34 func signal (channel chan int) {
35         // garante que a chamada só seja síncrona caso channel seja síncrono, ou seja,
36   // caso channel seja assíncrono e esteja com o buffer cheio não envia nada
37         if len(channel) < cap(channel) || cap(channel) == 0 {
38                 send(channel, 0) // poderia ser qualquer valor
39         }
42 // recebe um valor qualquer do canal channel
43 func wait (channel chan int) {
44         recv(channel) // ignora o valor recebido 
47 const (
48         MAX_SLEEP_TIME = 5
49         BUFFER_SIZE = 5
52 var pipe = make(chan int, BUFFER_SIZE)
54 func producer () {
55         for i := 0; ; i++ { // laço infinito
56                 Println("producing:", i)
57                 send(pipe, i)
58                 random_sleep()
59         }
62 func consumer () {
63         for { // laço infinito
64                 v := recv(pipe)
65                 Println("\t\t\tconsuming:", v)
66                 random_sleep()
67         }
70 func main () {
71         go producer()
72         go consumer()
73         wait(make(chan int)) // espera indefinidamente