Golang 関数の同時プログラミングでデータ競合を回避する方法

王林
リリース: 2024-04-17 21:39:01
オリジナル
645 人が閲覧しました

Go でのデータ競合を回避する方法には、同期プリミティブ (ミューテックス ロック、読み取り/書き込みロックなど) を使用して共有データへのアクセスを制御する、アトミック操作を使用して同時実行安全なデータ構造を使用して操作のアトミック性を確保する、などがあります。 sync.Map、sync.WaitGroup など); 実際のケース: ミューテックス ロックを使用して count 変数でのデータ競合を回避し、一度に 1 つの goroutine のみが変数を変更できるようにします。

Golang 関数の同時プログラミングでデータ競合を回避する方法

Go 関数の同時プログラミングでデータ競合を回避する方法

データ競合は、次の場合に発生します。複数の同時ゴルーチンが共有データに同時にアクセスします。 Go では、データ競合は次のようなさまざまな方法で回避できます。

  • 同期プリミティブの使用: ミューテックスや読み取り/書き込みロックなどの同期プリミティブを使用できます。共有データへのアクセスを制御します。同期プリミティブを使用する場合は、これらのプリミティブが正しい瞬間に取得および解放されるようにする必要があります。
  • アトミック操作を使用する: アトミック操作を使用すると、同時環境での一連の操作のアトミック性を確保できるため、データの競合を回避できます。 Go では、atomic.AddInt32atomic.LoadUint64 など、さまざまなアトミック操作が提供されています。
  • 同時実行安全なデータ構造を使用する: Go は、データ競合を自動的に処理できる sync.Map や sync.WaitGroup など、同時実行安全なデータ構造をいくつか提供します。

実際的なケース:

次の例は、ミューテックスを使用してデータの競合を回避する方法を示しています:

import (
    "fmt"
    "sync"
    "sync/atomic"
)

// 共享数据
var count int32

func increment() {
    // 获取互斥锁
    mutex.Lock()
    defer mutex.Unlock() // 该行确保在函数退出时释放互斥锁

    // 对共享数据进行修改
    count++
}

func main() {
    // 创建互斥锁
    var mutex sync.Mutex

    // 并发执行 100 次 increment 函数
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }

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

    // 输出最终计数
    fmt.Println(atomic.LoadInt32(&count))
}
ログイン後にコピー

この場合、 mutex ミューテックス ロックは、一度に 1 つのゴルーチンだけが count 変数にアクセスして変更できるようにするために使用され、それによってデータの競合を回避します。

以上がGolang 関数の同時プログラミングでデータ競合を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート