2 Concurrency Control, Mutexes And Channels
Mutexes
var sum int
var sumLock sync.Mutex
func worker() {
for i := 0; i < 100; i++ {
// locks while read/write data
sumLock.Lock()
new_val := sum + 1
sum = new_val
// unlocks when finished
sumLock.Unlock()
}
}
Channels
A way for different goroutines to exchange data
sending value into channel
chan <- val
receiving value from channel
var <- chan
func worker(sumChan chan int) {
privSum := 0
for i := 0; i < 100; i++ {
new_val := privSum + 1
privSum = new_val
}
// sending value into channel
sumChan <- privSum
}
func main() {
sumChan = make(chan int)
for i:=0; i < 100; i++ {
go worker(sumChan)
}
sum := 0
for i:=0; i < 100; i++ {
// receiving value from channel
sum += <- sumChan
}
fmt.Println(“sum: %v”, sum)
}
Buffered v.s. Unbuffered Channel
- If unbuffered, will not accept another send until the existing one is received
ch := make(chan int)
- allow N sends on the channel without blocking, until the buffer is full
ch := make(chan int, 3)