管道阻塞機制

package main
import (
“fmt”
“time”
)

/*
應用實例1
請完成goroutine和channel協同工作的案例,具體要求:
1)開啓一個writeData協程,向管道intChan中寫入50個整數。
2)開啓一個readData協程,從管道intChan中讀取writeData寫入的數據。
3)注意:writeData和readData操作的時同一個管道
4)主線程需要等待writeData和readData協程都完成工作才能退出

思路分析:

看代碼演示:
*/
//write Data,寫一個協程
func writeData(intChan chan int){
for i:=1;i<=50;i++{
//放入數據
intChan<-i
fmt.Println(“writeData”,i)
//time.Sleep(time.Second)
}
close(intChan)//循環寫入,寫入50個數據後,自動關閉
}
//寫另外一個協程read data
func readData(intChan chan int,exitChan chan bool){
//關閉後開始循環讀取,
for{
v,ok:=<-intChan
if !ok{
break
}
time.Sleep(time.Second)
fmt.Printf(“readData 讀到數據=%v\n”,v)
}
//readData讀取完數據後,即任務完成
exitChan<-true
close(exitChan)
}

func main(){
//創建兩個管道
intChan:= make(chan int,10)//10-50的話數據一下就就放入了
exitChan:=make(chan bool,1)

go writeData(intChan)
go readData(intChan,exitChan)
/*
如果註銷掉go readData(intChan,exitChan),程序會怎麼樣?
答:如果只是向管道寫入數據,而沒有讀取,就會出現阻塞而dead lock,原因是intChan容量是10,而代碼writeData會寫入50個數據,因此會阻塞再writeData的ch<-i
 */

time.Sleep(time.Second*10)

for{
	_,ok:=<-exitChan
	if!ok{
		break
	}
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章