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
46 for i := 0; ; i++ { // laço infinito
47 for count == BUFFER_SIZE { // buffer cheio?
48 random_sleep() // (almost) busy wait
51 if count < BUFFER_SIZE {
52 Println("producing:", i)
54 rear = (rear + 1) % BUFFER_SIZE
65 for { // laço infinito
66 for count == 0 { // buffer vazio?
67 random_sleep() // (almost) busy wait
72 front = (front + 1) % BUFFER_SIZE
74 Println("\t\t\tconsuming:", v)
82 buffer = make([]int, BUFFER_SIZE)
85 wait(make(chan int)) // espera indefinidamente