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