當我們在研讀作業系統的課程時,有讀到關於死結(deadlock).
昨天我們研究了golang的channel會有block的情形.
今天來看一下,死結狀況.
// hello68
package main
import (
"fmt"
)
func 接收(in chan string) {
fmt.Println("等待 Main() 傳送資料給我")
x := <-in
fmt.Println(x)
}
func main() {
out := make(chan string)
out <- "你好!"
go 接收(out)
}
執行情形:
./hello68
fatal error: all goroutines are asleep - deadlock!
進入deadlock了.
因為channel block的關係,互相等待,都進入睡眠,就發生死結狀況.
golang會回報發生死結狀況!
系統程式,死結難免.何以解憂,唯有Buffer!
讓我們來看看channel有buffer的情況.
// hello69
package main
import (
"fmt"
"time"
)
func 接收(in chan string) {
fmt.Printf("接收:等待 Main() 傳送資料給我 - %v\n", time.Now())
time.Sleep(time.Second * 5)
x := <-in
fmt.Printf("接受到: %s - %v\n", x, time.Now())
time.Sleep(time.Second * 5)
x = <-in
fmt.Printf("接受到: %s - %v\n", x, time.Now())
}
func main() {
buf := 100
out := make(chan string, buf)
go 接收(out)
out <- "你好!"
out <- "你好!#2"
time.Sleep(time.Second * 15)
fmt.Printf("Main()脫離 - %v\n", time.Now())
}
執行情形:
./hello69
接收:等待 Main() 傳送資料給我 - 2014-10-16 17:18:13.664813766 +0800 CST
接受到: 你好! - 2014-10-16 17:18:18.665119554 +0800 CST
接受到: 你好!#2 - 2014-10-16 17:18:23.665286611 +0800 CST
Main()脫離 - 2014-10-16 17:18:28.664846885 +0800 CST
整個程式執行時間約15秒,接收每隔五秒,接收一次.如同預期一般.