Skip to content

Instantly share code, notes, and snippets.

@KMwich
Created February 6, 2019 07:26
Show Gist options
  • Save KMwich/9fbd81c438be996f1f8271861cc0ac7f to your computer and use it in GitHub Desktop.
Save KMwich/9fbd81c438be996f1f8271861cc0ac7f to your computer and use it in GitHub Desktop.
HW2, Go to barrier
package main
import (
"fmt"
)
type callback func()
func pulseAll(amount int, pulse chan bool, success callback) {
for i := 0; i < amount; i++ {
pulse <- true
}
success()
}
func wait(wait chan bool) {
<-wait
}
func aSyncFunction(amount int, barrierChan chan int, doneChan chan bool, waitChan chan bool) {
n := <-barrierChan
fmt.Println(n)
if n == amount {
pulseAll(amount-1, waitChan, func() {
doneChan <- true
})
} else {
barrierChan <- n + 1
wait(waitChan)
}
}
func barrierFunction(amountOfBarrier int) {
barrierChannel := make(chan int)
doneChannel := make(chan bool)
waitChannel := make(chan bool)
for i := 0; i < amountOfBarrier; i++ {
go aSyncFunction(amountOfBarrier, barrierChannel, doneChannel, waitChannel)
}
barrierChannel <- 1
<-doneChannel
}
func main() {
barrierFunction(10)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment