ホームページ >バックエンド開発 >Golang >golang 関数と goroutine の間の同期メカニズムは何ですか?

golang 関数と goroutine の間の同期メカニズムは何ですか?

WBOY
WBOYオリジナル
2024-05-01 15:06:021065ブラウズ

Go 言語は、共有リソースへの同時アクセスによって引き起こされるデータの不整合や競合状態を解決するために、ミューテックス ロック、読み取り/書き込みロック、条件変数、WaitGroup などのさまざまな同期メカニズムを提供します。ミューテックス ロックは共有リソースへの排他的アクセスを提供し、読み取り/書き込みロックは複数の同時読み取りと単一書き込みをサポートし、条件変数はゴルーチン間の待機と通知を調整するために使用され、WaitGroup はゴルーチンのグループが完了するのを待機するために使用されます。たとえば、共有バッファの場合、ミューテックスにより、一度に 1 つの Goroutine だけがバッファにアクセスできるようになり、データの破損が回避されます。

golang 関数と goroutine の間の同期メカニズムは何ですか?

Go 言語の関数とゴルーチンの同期メカニズム

同時プログラミングでは、同期メカニズムは非常に重要であり、次の目的で使用されます。共有リソースへの同時アクセスによってデータの不整合や競合状態が発生しないようにしてください。 Go 言語は、さまざまな同期メカニズムを提供します。関数とゴルーチンを同期するために最も一般的に使用されるメカニズムを次に示します。

Mutex (Mutex)

Mutex ロックは、排他的ロックを提供します。共有リソースへのアクセス。 Goroutine がミューテックスを取得すると、Goroutine がミューテックスを解放するまで他の Goroutine はブロックされます。

var mu sync.Mutex

func someFunction() {
    mu.Lock()
    // 对共享资源进行操作
    mu.Unlock()
}

読み取り/書き込みロック (RWMutex)

読み取り/書き込みロックを使用すると、複数の Goroutine が共有リソースを同時に読み取ることができますが、共有リソースに書き込むことができるのは 1 つの Goroutine だけです同時にリソースも。

var rwmu sync.RWMutex

func someFunction() {
    rwmu.RLock()
    // 读取共享资源
    rwmu.RUnlock()
}

func anotherFunction() {
    rwmu.Lock()
    // 写入共享资源
    rwmu.Unlock()
}

条件変数 (Cond)

条件変数は、ゴルーチン間の待機と通知を調整するために使用されます。 Goroutine は、別の Goroutine が通知するまで条件変数を待機できます。

var cond sync.Cond

func someFunction() {
    cond.L.Lock()
    // 等待条件变量被通知
    cond.Wait(&cond.L)
    // 执行被通知后的代码
    cond.L.Unlock()
}

func anotherFunction() {
    cond.L.Lock()
    // 通知正在等待条件变量的 Goroutine
    cond.Signal()
    cond.L.Unlock()
}

WaitGroup

WaitGroup は、Goroutine のグループが完了するのを待つために使用されます。すべてのゴルーチンが完了するまで、特定の操作が実行されないようにします。

var wg sync.WaitGroup

func someFunction() {
    wg.Add(1)

    // Goroutine 执行一些任务

    wg.Done()
}

func main() {
    wg.Add(5)

    for i := 0; i < 5; i++ {
        go someFunction()
    }

    // 等待所有 Goroutine 完成
    wg.Wait()

    // 主 Goroutine 执行一些操作
}

実用的なケース

複数のゴルーチンがバッファーからデータを読み書きする例として、共有バッファーを取り上げます。ミューテックスを使用すると、バッファへの同時アクセスを保証できます。

var mu sync.Mutex
type Buffer struct {
    data []int
}

func (b *Buffer) Read() []int {
    mu.Lock()
    defer mu.Unlock()

    return b.data
}

func (b *Buffer) Write(data []int) {
    mu.Lock()
    defer mu.Unlock()

    b.data = data
}

ミューテックスを使用すると、常に 1 つの Goroutine だけが共有バッファにアクセスできるようになり、データの損傷が回避されます。

以上がgolang 関数と goroutine の間の同期メカニズムは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。