十一 併發程式設計

2021-09-11 04:20:58 字數 3057 閱讀 9186

//子go程

func sing(i int)

//子go程

func dance(i int)

//主go程

func main()

//主go程結束,子go程隨之退出。所以這裡要睡10秒等子go程執行完畢,不然看不見子go程列印輸出。

time.sleep(10 * time.second)

}

1.1runtime包

len(ch):channel 中剩餘未讀取資料個數。cap(ch):通道的容量。

確定不再相對端傳送、接收資料。關閉channel。使用:close(chs)

func main()  else 

//迴圈寫

go func()

close(chs) //關閉channel

}()//迴圈讀

for ch := range chs

}

2.1單向channel
ch4 := make(chan int)

ch5 := <-chan int(ch4) // ch5就是乙個單向的讀取channel

ch6 := chan<- int(ch4) // ch6 是乙個單向的寫入channel

func parse(ch <-chan int) 

}

select
func main() 

i := <-ch

fmt.println("value received:", i)

}}

3.1超時機制
func main() ()

// 然後我們把timeout這個channel利用起來

select

}

//生產者:單向寫channel

func producer(out chan<- int, idx int)

}//消費者:單向讀channel

func consumer(in <-chan int, idx int)

}func main()

for i := 0; i < 1; i++

quit := make(chan bool)

<-quit //沒有寫,直接讀,讓主go程阻塞

}

4.1條件變數
var cond sync.cond // 定義全域性條件變數

func producer(out chan<- int, idx int)

num := rand.intn(800) //產生隨機數

out <- num

fmt.printf("生產者%dth,生產:%d\n", idx, num)

cond.l.unlock() // 訪問公共區結束,並且列印結束,解鎖

// 喚醒阻塞在條件變數上的 消費者

cond.signal() 廣播方式,喚醒全部生產者

time.sleep(time.millisecond * 200) }}

func consumer(in <-chan int, idx int)

num := <-in

fmt.printf("-----消費者%dth,消費:%d\n", idx, num)

cond.l.unlock() // 訪問公共區結束後,解鎖

// 喚醒 阻塞在條件變數上的 生產者

cond.signal() 廣播方式,喚醒全部生產者

time.sleep(time.millisecond * 200) }}

func main()

for i := 0; i < 5; i++

quit := make(chan bool)

<-quit //沒有寫,直接讀,讓主go程阻塞

}

//第一種定時:sleep

func timer1()

//第二種定時:newtimer

func timer2()

//第三種定時:after

func timer3()

func main()

5.1定時器重置、停止
func main() ()

mytimer.stop() //停止,將定時器歸零。 <-mytimer.c 會阻塞

time.sleep(10 * time.second)

fmt.println("主go程醒了。。。")

}

5.2週期定時器
func main() 

}()time.sleep(10 * time.second)

fmt.println("週期定時器。。。")

}

6.1channel同步
func print(str string) 

}func print1(ch chan int)

func print2(ch chan int)

func main()

6.2同步鎖

var lock sync.mutex

func print(str string)

lock.unlock()

}func print1()

func print2()

func main()

6.3全域性唯一性
var once sync.once

func setup()

func doprint()

func main()

}()time.sleep(10 * time.second)

}

初始化完成。。。

開始搞事情。。。

開始搞事情。。。

開始搞事情。。。

開始搞事情。。。

開始搞事情。。。

併發程式設計的藝術(一) 併發程式設計的挑戰

含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...

java併發程式設計(一) 併發程式設計需要注意問題

目錄 問題一上下文切換會帶來額外的開銷 執行緒的執行機制 什麼是上下文切換 上下文切換的過程 上下文切換是有開銷的 如何減少上下文切換 問題二併發不當可能會產生死鎖 什麼是死鎖 死鎖示例 如何避免死鎖 問題三計算機資源會限制併發 誤區執行緒越多速度越快 什麼是資源 如何解決資源的限制 併發是為了提公...

一 併發簡介

1.1併發簡史 早期的馮丶諾依曼型計算機的主要特點是 1.數字計算機的數制採用二進位制 2.計算機應該按照程式順序執行。之後伴隨著作業系統的誕生,使得計算機每次可以執行多個程式,每個程式執行在單獨的程序中。早期的分時系統中,每乙個程序相當於一台虛擬的馮丶諾依曼型計算機。程序是作業系統分配資源的最小單...