ホームページ  >  記事  >  バックエンド開発  >  Mutex ロックを使用して同時 Goroutine で相互排他を実現するにはどうすればよいですか?

Mutex ロックを使用して同時 Goroutine で相互排他を実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 17:43:30123ブラウズ

How can Mutex Locks be used to achieve Mutual Exclusion in Concurrent Goroutines?

ミューテックス ロックによる同時実行ゴルーチンの相互排除

コード内で、各ゴルーチンの特定のコード セクションが分離して実行されるようにする必要があります。 。これにより、他のゴルーチンによるこれらのセクションの同時実行が防止されます。ここでは、ミューテックス ロックを使用して相互排他を実現する方法を示します。

提供されたコードの概要は、ゴルーチンのフローと相互排他の必要性を示しています。 1 つの goroutine で特定のイベントが実行されている間、実行が他の goroutine に渡されるのを防ぎたいとします。

これを実装するには、ミューテックス ロックを使用できます。ミューテックスにより、常に 1 つの goroutine だけが共有リソースにアクセスできるようになります。以下は、相互排他にミューテックスを利用するコードを少し変更したバージョンです:

<code class="go">package main

import (
    "fmt"
    "rand"
    "sync"
)

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)

func Routine1() {
    mutex1.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex2.Lock()
        mutex3.Lock()
        fmt.Println("Value of z")
        mutex2.Unlock()
        mutex3.Unlock()
    }
    // Do something
    mutex1.Unlock()
    wg.Done()
}

func Routine2() {
    mutex2.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex3.Lock()
        fmt.Println("Value of z")
        mutex1.Unlock()
        mutex3.Unlock()
    }
    // Do something
    mutex2.Unlock()
    wg.Done()
}

func Routine3() {
    mutex3.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex2.Lock()
        fmt.Println("Value of z")
        mutex1.Unlock()
        mutex2.Unlock()
    }
    // Do something
    mutex3.Unlock()
    wg.Done()
}

func main() {
    wg.Add(3)
    go Routine1()
    go Routine2()
    Routine3()
    wg.Wait()
}</code>

この更新されたコードが相互排他を実現する方法は次のとおりです:

  1. ゴルーチンごとにミューテックス ロックが作成されます(mutex1、mutex2、および mutex3)。
  2. ゴルーチンがクリティカル セクション (相互排他が必要な場合) にアクセスする必要がある場合、対応するミューテックスをロックします。
  3. ミューテックスがロックされている間、 1 つのゴルーチンが存在すると、同じミューテックスにアクセスしようとする他のゴルーチンは、ロックが解除されるまでブロックされます。
  4. クリティカル セクションが完了すると、ゴルーチンはミューテックスのロックを解除し、他のゴルーチンがアクセスできるようになります。

この実装により、各ゴルーチンの指定されたコード セクションが分離して実行され、他のゴルーチンからの同時実行が防止されます。

以上がMutex ロックを使用して同時 Goroutine で相互排他を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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