老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

GolangWaitGroup源碼分析-創新互聯

針對Golang 1.9的sync.WaitGroup進行分析,與Golang 1.10基本一樣除了將panic改為了throw之外其他的都一樣。
源代碼位置:sync\waitgroup.go

成都創新互聯公司主要從事成都網站設計、網站制作、網頁設計、企業做網站、公司建網站等業務。立足成都服務寧晉,10年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:13518219792

結構體

type WaitGroup struct {
    noCopy noCopy  // noCopy可以嵌入到結構中,在第一次使用后不可復制,使用go vet作為檢測使用
    // 位值:高32位是計數器,低32位是goroution等待計數。
    // 64位的原子操作需要64位的對齊,但是32位。編譯器不能確保它,所以分配了12個byte對齊的8個byte作為狀態。
    state1 [12]byte // byte=uint8范圍:0~255,只取前8個元素。轉為2進制:0000 0000,0000 0000... ...0000 0000
    sema   uint32   // 信號量,用于喚醒goroution
}

不知道大家是否和我一樣,不論是使用Java的CountDownLatch還是Golang的WaitGroup,都會疑問,可以裝下多個線程|協程等待呢?看了源碼后可以回答了,可以裝下

1111 1111 1111 ... 1111
\________32___________/

2^32個辣么多!所以不需要擔心單機情況下會被撐爆了。

函數

以下代碼已經去掉了與核心代碼無關的race代碼。

Add

添加或者減少等待goroutine的數量。

參數delta可能是負的,加到WaitGroup計數器,可能出現如下結果

  • 如果計數器變為零,所有被阻塞的goroutines都會被釋放。
  • 如果計數器變成負數,就增加恐慌。
func (wg *WaitGroup) Add(delta int) {
    // 獲取到wg.state1數組中元素組成的二進制對應的十進制的值
    statep := wg.state()
    // 高32位是計數器
    state := atomic.AddUint64(statep, uint64(delta)<<32)
    // 獲取計數器
    v := int32(state >> 32)
   w := uint32(state)
    // 計數器為負數,報panic
    if v < 0 {
        panic("sync: negative WaitGroup counter")
    }
    // 添加與等待并發調用,報panic
    if w != 0 && delta > 0 && v == int32(delta) {
        panic("sync: WaitGroup misuse: Add called concurrently with Wait")
    }
    // 計數器添加成功
    if v > 0 || w == 0 {
        return
    }

    // 當等待計數器> 0時,而goroutine設置為0。
    // 此時不可能有同時發生的狀態突變:
    // - 增加不能與等待同時發生,
    // - 如果計數器counter == 0,不再增加等待計數器
    if *statep != state {
        panic("sync: WaitGroup misuse: Add called concurrently with Wait")
    }
    // Reset waiters count to 0.
    *statep = 0
    for ; w != 0; w-- {
        // 目的是作為一個簡單的wakeup原語,以供同步使用。true為喚醒排在等待隊列的第一個goroutine
        runtime_Semrelease(&wg.sema, false)
    }
}
// unsafe.Pointer其實就是類似C的void *,在golang中是用于各種指針相互轉換的橋梁。
// uintptr是golang的內置類型,是能存儲指針的整型,uintptr的底層類型是int,它和unsafe.Pointer可相互轉換。
// uintptr和unsafe.Pointer的區別就是:unsafe.Pointer只是單純的通用指針類型,用于轉換不同類型指針,它不可以參與指針運算;
// 而uintptr是用于指針運算的,GC 不把 uintptr 當指針,也就是說 uintptr 無法持有對象,uintptr類型的目標會被回收。
// state()函數可以獲取到wg.state1數組中元素組成的二進制對應的十進制的值
func (wg *WaitGroup) state() *uint64 {
    if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 {
        return (*uint64)(unsafe.Pointer(&wg.state1))
    } else {
        return (*uint64)(unsafe.Pointer(&wg.state1[4]))
    }
}

Done

相當于Add(-1)。

func (wg *WaitGroup) Done() {
    // 計數器減一
   wg.Add(-1)
}

Wait

執行阻塞,直到所有的WaitGroup數量變成0。

func (wg *WaitGroup) Wait() {
    // 獲取到wg.state1數組中元素組成的二進制對應的十進制的值
    statep := wg.state()
    // cas算法
    for {
        state := atomic.LoadUint64(statep)
        // 高32位是計數器
        v := int32(state >> 32)
       w := uint32(state)
        // 計數器為0,結束等待
        if v == 0 {
            // Counter is 0, no need to wait.
            return
        }
        // 增加等待goroution計數,對低32位加1,不需要移位
        if atomic.CompareAndSwapUint64(statep, state, state+1) {
            // 目的是作為一個簡單的sleep原語,以供同步使用
            runtime_Semacquire(&wg.sema)
            if *statep != 0 {
                panic("sync: WaitGroup is reused before previous Wait has returned")
            }
            return
        }
    }
}

使用注意事項

  1. WaitGroup不能保證多個 goroutine 執行次序
  2. WaitGroup無法指定固定的goroutine數目

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


本文題目:GolangWaitGroup源碼分析-創新互聯
本文鏈接:http://www.xueling.net.cn/article/pdjge.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲精品在线视频播放 | 韩国精品久久久 | 国产精品伊人久久久 | 天堂一区二区三区 | 精品亚洲国产成av人片传媒 | 亚洲伦理在线视频 | 毛豆日产精品卡2卡3卡4卡免费 | 成人免费A级毛片免费 | 国产a视频精品免费观看 | yy1111111少妇影院光屁股 | 人妻阿敏被老外玩弄系列 | 超碰公开97 | 成人国产精品久久久春色 | 欧美人与动牲交a欧美精品 44444kk在线观看三免费 | a免费毛片| 奇米影视第4色 | 精品福利国产 | 老司机久久 | 情侣黄网站免费看 | 一本色道久久88精品综合 | 97精品国产97久久久久久久久久久久 | 亚洲国产av无码精品果冻传媒 | 日日干夜夜操高清视频 | 亚洲欧美日韩在线一区二区三区 | 国产精品9区 | 国产尤物在线观看yw | 欧美极品视频一区二区三区 | 999在线 | 久久天天 | 日韩三片 | 91福利精品第一导航禁漫天堂 | 舌L子伦熟妇ΑV | 97成人资源 | 国产成人片一区在线观看 | 日韩欧美国产一区二区三区 | 二级特黄绝大片免费视频大片 | 91新网址 | 99久久夜色精品国产亚洲狼 | 亚洲青涩在线 | 4d玉蒲团奶水都喷出来了免费 | 欧美日韩亚洲在线观看 |