iT邦幫忙

DAY 16
1

蠻可愛的 Golang系列 第 16

死結狀況及其處理

當我們在研讀作業系統的課程時,有讀到關於死結(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秒,接收每隔五秒,接收一次.如同預期一般.


上一篇
回到concurrent
下一篇
Concurrent程式設計之信號傳遞
系列文
蠻可愛的 Golang30

尚未有邦友留言

立即登入留言