日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解_Golang

作者:陳博士 ? 更新時(shí)間: 2022-10-22 編程語言

sync.WaitGroup結(jié)構(gòu)體對象

在Go語言中,sync.WaitGroup結(jié)構(gòu)體對象用于等待一組線程的結(jié)束;WaitGroup是go并發(fā)中最常用的工具,我們可以通過WaitGroup來表達(dá)這一組協(xié)程的任務(wù)是否完成,以決定是否繼續(xù)往下走,或者取任務(wù)結(jié)果;

WaitGroup的結(jié)構(gòu)體

結(jié)構(gòu)如下所示:

type WaitGroup struct { 
    noCopy noCopy 
    state1 [3]uint32 
}

在sync.WaitGroup結(jié)構(gòu)體對象中有三個(gè)方法,Add()、Done()、Wait()

Add()方法

主要為WaitGroup的等待數(shù)+1或者+n;

Add()方法的定義如下:

func(*WaitGroup) Add()
  • Add()方法內(nèi)部計(jì)數(shù)器加上delta,delta可以是負(fù)數(shù);
  • 如果內(nèi)部計(jì)數(shù)器變?yōu)?,則Wait()方法會(huì)將處于阻塞等待的所有g(shù)oroutine釋放;
  • 如果計(jì)數(shù)器小于0,則調(diào)用panic()函數(shù);
  • Add()方法加上正數(shù)的調(diào)用應(yīng)在Wait()方法之前,否則Wait()方法可能只會(huì)等待很少的goroutine;
  • Add()方法在創(chuàng)建新的goroutine或者其它等待的事件之前調(diào)用;

Done()方法

Done函數(shù)調(diào)用的也是Add函數(shù),主要用于-1操作;

Done()方法的定義如下:

func(wg *WaitGroup) Done()
  • Done()方法會(huì)減少WaitGroup計(jì)數(shù)器的值,一般在goroutine的最后執(zhí)行;

Wait()方法

阻塞當(dāng)前協(xié)程,直到等待數(shù)歸為0才繼續(xù)向下執(zhí)行;

Wait()方法的定義如下:

func (wg *WaitGroup) Wait()

Wait()方法會(huì)阻塞,知道WaitGroup計(jì)數(shù)器減為0.

Add()、Done()、Wait()三者對比

  • 在三個(gè)方法中,使用Add()方法添加計(jì)數(shù),使用Done()方法減掉一個(gè)計(jì)數(shù),如果計(jì)數(shù)不為0,則會(huì)阻塞Wait()方法的運(yùn)行;
  • 一個(gè)goroutine調(diào)用Add()方法來設(shè)定等待的goroutine的數(shù)量;
  • 每個(gè)被等待的goroutine在結(jié)束時(shí)調(diào)用Done()方法;
  • 在主goroutine里可以調(diào)用Wait()方法阻塞至所有g(shù)oroutine結(jié)束;

sync.WaitGroup使用示例

使用sync.WaitGroup等待goroutine結(jié)束的示例如下圖所示:

原文鏈接:https://juejin.cn/post/7135606607391981582

欄目分類
最近更新