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 signal (channel
chan int) {
23 if len(channel
) < cap(channel
) ||
cap(channel
) == 0 {
28 func wait (channel
chan int) {
33 MAX_SLEEP_TIME
= 5 // tempo máximo de sleep
34 BUFFER_SIZE
= 5 // tamanho do buffer
40 count
, front
, rear
= 0, 0, 0
44 for i
:= 0; ; i
++ { // laço infinito
45 for count
== BUFFER_SIZE
{ // buffer cheio?
46 random_sleep() // (almost) busy wait
49 if count
< BUFFER_SIZE
{
50 Println("producing:", i
)
52 rear
= (rear
+ 1) % BUFFER_SIZE
63 for { // laço infinito
64 for count
== 0 { // buffer vazio?
65 random_sleep() // (almost) busy wait
70 front
= (front
+ 1) % BUFFER_SIZE
72 Println("\t\t\tconsuming:", v
)
80 buffer
= make([]int, BUFFER_SIZE
)
83 wait(make(chan int)) // espera indefinidamente