tudo pronto
[3hU9fRjo95.git] / pc_channel.go
blob352b063850173ed1b41a8c1839ba5920a21e9982
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
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()
62 func consumer () {
63 for { // laço infinito
64 v := recv(pipe)
65 Println("\t\t\tconsuming:", v)
66 random_sleep()
70 func main () {
71 go producer()
72 go consumer()
73 wait(make(chan int)) // espera indefinidamente