Go語言同步等待組sync.WaitGroup結構體對象方法詳解

sync.WaitGroup結構體對象

在Go語言中,sync.WaitGroup結構體對象用於等待一組線程的結束;WaitGroup是go並發中最常用的工具,我們可以通過WaitGroup來表達這一組協程的任務是否完成,以決定是否繼續往下走,或者取任務結果;

WaitGroup的結構體

結構如下所示:

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

在sync.WaitGroup結構體對象中有三個方法,Add()、Done()、Wait()

Add()方法

主要為WaitGroup的等待數+1或者+n;

Add()方法的定義如下:

func(*WaitGroup) Add()
  • Add()方法內部計數器加上delta,delta可以是負數;
  • 如果內部計數器變為0,則Wait()方法會將處於阻塞等待的所有goroutine釋放;
  • 如果計數器小於0,則調用panic()函數;
  • Add()方法加上正數的調用應在Wait()方法之前,否則Wait()方法可能隻會等待很少的goroutine;
  • Add()方法在創建新的goroutine或者其它等待的事件之前調用;

Done()方法

Done函數調用的也是Add函數,主要用於-1操作;

Done()方法的定義如下:

func(wg *WaitGroup) Done()
  • Done()方法會減少WaitGroup計數器的值,一般在goroutine的最後執行;

Wait()方法

阻塞當前協程,直到等待數歸為0才繼續向下執行;

Wait()方法的定義如下:

func (wg *WaitGroup) Wait()

Wait()方法會阻塞,知道WaitGroup計數器減為0.

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

  • 在三個方法中,使用Add()方法添加計數,使用Done()方法減掉一個計數,如果計數不為0,則會阻塞Wait()方法的運行;
  • 一個goroutine調用Add()方法來設定等待的goroutine的數量;
  • 每個被等待的goroutine在結束時調用Done()方法;
  • 在主goroutine裡可以調用Wait()方法阻塞至所有goroutine結束;

sync.WaitGroup使用示例

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

以上就是Go語言同步等待組sync.WaitGroup結構體對象方法詳解的詳細內容,更多關於Go sync.WaitGroup結構體的資料請關註WalkonNet其它相關文章!

推薦閱讀: