go語言sync包的學習(Mutex、WaitGroup、Cond)

來源:互聯網
上載者:User

標籤:資料   unlock   多核   指標   rlock   引用   port   div   roc   

package main;import ("fmt""sync""runtime""time")//加鎖,注意鎖要以指標的形式傳進來,不然只是拷貝func total1(num *int, mu *sync.Mutex, ch chan bool) {mu.Lock();for i := 0; i < 1000; i++ {*num += i;}ch <- true;mu.Unlock();}//不加鎖func total2(num *int, ch chan bool) {for i := 0; i < 1000; i++ {*num += i;}ch <- true;}//Lock、Unlock與RLock、RUnlock不能嵌套使用func total3(num *int, rwmu *sync.RWMutex, ch chan bool) {for i := 0; i < 1000; i++ {rwmu.Lock();*num += i;rwmu.Unlock();if(i == 500) {//讀鎖定rwmu.RLock();fmt.Print(*num, " ");rwmu.RUnlock();}}ch <- true;}func printNum(num int, cond *sync.Cond) {cond.L.Lock();if num < 5 {//num小於5時,進入等待狀態cond.Wait();}//大於5的正常輸出fmt.Println(num);cond.L.Unlock();}func main() {//Once.Do()保證多次調用只執行一次once := sync.Once{};ch := make(chan bool, 3);for i := 0; i < 3; i++ {go func(n int) {once.Do(func() {//只會執行一次,因為閉包引用了變數n,最後的值為2fmt.Println(n)});//給chan發送true,表示執行完成ch <- true;}(i);}for i := 0; i < 3; i++ {//讀取三次chan,如果上面三次沒執行完會一直阻塞<-ch;}//互斥鎖,保證某一時刻只能有一個訪問對象mutex := sync.Mutex{};ch2 := make(chan bool, 20);//使用多核,不然下面的結果會一樣runtime.GOMAXPROCS(runtime.NumCPU());num1 := 0;num2 := 0;for i := 0; i < 10; i++ {go total1(&num1, &mutex, ch2);}for i := 0; i < 10; i++ {go total2(&num2, ch2);}for i := 0; i < 20; i++ {<-ch2;}//會發現num1與num2計算出的結果不一樣//而num1的結果才是正確的,因為total2沒有加鎖,導致多個goroutine操作num時發生資料混亂fmt.Println(num1, num2);//讀寫鎖,多了讀鎖定,和讀解鎖,讓多個goroutine同時讀取對象rwmutex := sync.RWMutex{};ch3 := make(chan bool, 10);num3 := 0;for i := 0; i < 10; i++ {go total3(&num3, &rwmutex, ch3);}for i := 0; i < 10; i++ {<-ch3;}fmt.Println(num3);//組等待,等待一組goroutine的結束wg := sync.WaitGroup{};//增加計數器wg.Add(10);for i:= 0; i< 10; i++ {go func(n int) {fmt.Print(n, " ");//這裡表示該goroutine執行完成wg.Done();}(i);}//等待所有線程執行完成wg.Wait();fmt.Println("");//條件等待mutex2 := sync.Mutex{};//使用鎖建立一個條件等待cond := sync.NewCond(&mutex2);for i := 0; i < 10; i++ {go printNum(i, cond);}time.Sleep(time.Second * 1);//等待一秒後,我們先喚醒一個等待,輸出一個數字cond.L.Lock()cond.Signal();cond.L.Unlock();time.Sleep(time.Second * 1);//再次待待一秒後,喚醒所有,輸出餘下四個數字cond.L.Lock()cond.Broadcast();cond.L.Unlock();time.Sleep(time.Second * 1);}

  

go語言sync包的學習(Mutex、WaitGroup、Cond)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.