package main
import (
"fmt"
"sync"
)
var m sync.Mutex
func function() {
m.Lock()
fmt.Println("Locked!")
}
func main() {
var w sync.WaitGroup
go func() {
defer w.Done()
function()
}()
w.Add(1)
go func() {
defer w.Done()
function()
}()
w.Add(1)
w.Wait()
}
$go run forgetMutex.go
Locked!
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc42001209c)
/usr/local/Cellar/go/1.9.4/libexec/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc420012090)
/usr/local/Cellar/go/1.9.4/libexec/src/sync/waitgroup.go:131 +0x72 main.main()
/Users/mtsouk/forgetMutex.go:30 +0xb6
goroutine 5 [semacquire]:
sync.runtime_SemacquireMutex(0x115c6fc, 0x0)
/usr/local/Cellar/go/1.9.4/libexec/src/runtime/sema.go:71 +0x3d
sync.(*Mutex).Lock(0x115c6f8)
/usr/local/Cellar/go/1.9.4/libexec/src/sync/mutex.go:134 +0xee main.function()
/Users/mtsouk/forgetMutex.go:11 +0x2d main.main.func1(0xc420012090)
/Users/mtsouk/forgetMutex.go:20 +0x48 created by main.main
/Users/mtsouk/forgetMutex.go:18 +0x58 exit status 2