better code organization
[3hU9fRjo95.git] / pc_sem.go~
blobba463a035851d6dff818617880769db6482d8fe3
1 /* pc_sem.go */
3 package main
5 import (
6         . "fmt"
7         "crypto/rand"
8         "time"
11 func random_entre (begin, end int64) int64 {
12         random_byte := make([]byte, 1)
13         rand.Read(random_byte)
14         return int64(random_byte[0]) % (end - begin + 1) + begin
17 func random_sleep () {
18         time.Sleep(random_entre(0, MAX_SLEEP_TIME) * 10e7)
21 func signal (channel chan int) {
22         if len(channel) < cap(channel) || cap(channel) == 0 {
23                 channel <- 0
24         }
27 func wait (channel chan int) {
28         <-channel
31 func produtor () {
32         for i := 0; ; i++ {
33                 wait(empty)
34                 wait(mutex)
35                         Println("produzindo:", i)
36                         buffer[rear] = i
37                         rear = (rear + 1) % BUFFER_SIZE
38                 signal(mutex)
39                 signal(full)
41                 random_sleep()
42         }
45 func consumidor () {
46         for {
47                 wait(full)
48                 wait(mutex)
49                         v := buffer[front]
50                         front = (front + 1) % BUFFER_SIZE
51                         Println("\tconsumindo:", v)
52                 signal(mutex)
53                 signal(empty)
55                 random_sleep()
56         }
59 const MAX_SLEEP_TIME = 5
61 var (
62         BUFFER_SIZE = 5
63         mutex = make(chan int, 1);
64         empty chan int;
65         full    chan int;
66         buffer []int;
67         front = 0;
68         rear    = 0
71 func main () {
72         buffer = make([]int, BUFFER_SIZE)
73         empty = make(chan int, BUFFER_SIZE);
74         full = make(chan int, BUFFER_SIZE)
75         for i := 0; i < BUFFER_SIZE; i++ {
76                 signal(empty)
77         }
78         signal(mutex)
79         go produtor()
80         go consumidor()
81         wait(make(chan int))