2012-11-26 62 views
7
package main 

import (
    "fmt" 
    "sync" 
) 

func push(c chan int,wg sync.WaitGroup) { 
    for i := 0; i < 5; i++ { 
     c <- i 
    } 
    wg.Done() 
} 

func pull(c chan int,wg sync.WaitGroup) { 
    for i := 0; i < 5; i++ { 
     result,ok := <- c 
     fmt.Println(result,ok) 
    } 
    wg.Done() 
} 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(2) 
    c := make(chan int) 

    go push(c,wg) 
    go pull(c,wg) 

    wg.Wait() 
} 

輸出:爲什麼我的golang頻道提高死鎖錯誤?

localhost:src kuankuan$ go run goroutine.go 
0 true 
1 true 
2 true 
3 true 
4 true 
throw: all goroutines are asleep - deadlock! 

goroutine 1 [semacquire]: 
sync.runtime_Semacquire(0x42130100, 0x42130100) 
    /usr/local/go/src/pkg/runtime/zsema_amd64.c:146 +0x25 
sync.(*WaitGroup).Wait(0x42120420, 0x0) 
    /usr/local/go/src/pkg/sync/waitgroup.go:79 +0xf2 
main.main() 
    /Users/kuankuan/go/src/goroutine.go:31 +0xb9 

goroutine 2 [syscall]: 
created by runtime.main 
    /usr/local/go/src/pkg/runtime/proc.c:221 
exit status 2 

回答

17

爲什麼死鎖是因爲結構是按值傳遞,而不是引用的原因。

當您將WaitGroup傳遞給您的函數時,您需要傳遞指針而不是該值。否則,將使用WaitGroup的副本。

這是你的工作例如:

package main 

import (
    "fmt" 
    "sync" 
) 

func push(c chan int,wg *sync.WaitGroup) { 
    for i := 0; i < 5; i++ { 
     c <- i 
    } 
    wg.Done() 
} 

func pull(c chan int,wg *sync.WaitGroup) { 
    for i := 0; i < 5; i++ { 
     result,ok := <- c 
     fmt.Println(result,ok) 
    } 
    wg.Done() 
} 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(2) 
    c := make(chan int) 

    go push(c,&wg) 
    go pull(c,&wg) 

    wg.Wait() 
}