golang-sync.WaitGroup使用例

1662 ワード

golangには2つの方式の同期プログラムがあります.一つはチャンネルを使って、もう一つはロック機構を使っています.チャンネルを使ったケースは私のブログを参考にしてもいいです.golang-chanelを使ってgoroutineを同期させます.ここではロック機構に関連しています.もっと具体的にはsync.WaitGroupです.比較的簡単な同期方法集です.
sync.Wait Groupは3つの方法しかありません.Add()、Dune()、Wait()です.Dune()はAdd(-1)の別名です.簡単には、Add()を使ってカウントを追加し、Dune()はカウントを1つ減らし、カウントは0ではなく、Wait()の運転をブロックします.
ちょっと注意したいのです.sync文書で説明したのは、The main goroutine call Add to set the number of goroutines to wait for.The n each of the goroutines runs and cals Donwhen finished.つまり、main関数を実行するgoroutineでAdd(gone)を実行します.これは雷を踏みました.
一番簡単な例はsync文書の中のexampleです.ここで簡単に例を書きました.
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
    }

    for i := 0; i < 100; i++ {
        go wg.Done()
    }
    fmt.Println("exit")
    wg.Wait()
}

func add(wg sync.WaitGroup) {
    wg.Add(1)
}


func done(wg sync.WaitGroup) {
    wg.Done()
}
自分のパソコンでgodocを使って搭載したsyncドキュメントに、このカバンを追加する方法はimport「pkg/sync」と明記したbugがあります.一般的なプログラムはimport「sync」です.自分でテストしました.import. 「sync」が正しいです.import「pkg/sync」のコンパイルは全部通ります.皆さんもテストしてもいいです.golang.orgでもう直しました.
ありがとうございます.