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) {
41 front, rear, count int
46 func newMonitor () *Monitor {
51 make([]int, BUFFER_SIZE),
55 func (m *Monitor) produce (i int) {
57 for m.count == BUFFER_SIZE {
59 go waiter(m.empty, c) // necessário para simular a atomicidade
61 wait(c) // variável de condição
64 Println("producing:", i)
66 m.rear = (m.rear + 1) % BUFFER_SIZE
72 func (m *Monitor) consume () {
76 go waiter(m.full, c) // necessário para simular a atomicidade
81 v := m.buffer[m.front]
82 m.front = (m.front + 1) % BUFFER_SIZE
84 Println("\t\t\tconsuming:", v)
90 for i := 0; ; i++ { // laço infinito
97 for { // laço infinito
104 monitor = newMonitor()
107 wait(make(chan int)) // espera indefinidamente