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) {
28 // recebe um inteiro através do canal channel e o retorna
29 func recv (channel chan int) int {
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
52 var pipe = make(chan int, BUFFER_SIZE)
55 for i := 0; ; i++ { // laço infinito
56 Println("producing:", i)
63 for { // laço infinito
65 Println("\t\t\tconsuming:", v)
73 wait(make(chan int)) // espera indefinidamente