Golang (Go)

goroutines (based on CSP) and deadlock

The following code deadlocks.

$ go run deadlock.go

package main 
import "fmt" 
import "time"

func Send(ch chan<- int) { ch <- 42 }

func Recv(ch <-chan int, done chan<- int) {
    val := <-ch 
    done <- val
}

func Work() { 
    for {
        fmt.Println("Working..")
        time.Sleep(1 * time.Second) 
    }
}

func main() { // main
    ch, done := make(chan int), make(chan int)
    go Send(ch) 
    go Recv(ch, done)
    go Recv(ch, done) 
    go Work() // comment this out for complete deadlock detection
    <-done // First receive
    <-done // Second receive, mismatched relative deadlock