ホームページ >バックエンド開発 >Golang >Golang では変数の代入はアトミックですか?

Golang では変数の代入はアトミックですか?

PHPz
PHPzオリジナル
2024-01-18 09:44:06922ブラウズ

Golang では変数の代入はアトミックですか?

Golang における変数代入操作はアトミックですか?特定のコード例が必要です。

Go 言語では、変数代入操作の原子性が一般的な問題です。アトミック性とは、実行中に操作が中断されない特性を指し、複数のスレッドが同時に同じ変数にアクセスしたり変更したりしても、中間状態が存在しません。これは、同時実行プログラムの正確性にとって非常に重要です。

Go 言語標準ライブラリは、アトミック操作を実行するための sync/atomic パッケージを提供します。このパッケージのアトミック操作により、変数の読み取りと変更がアトミックであることが保証されます。ただし、代入操作自体は Go 言語のアトミック操作ではないことに注意してください。

変数代入操作のアトミック性の問題をより深く理解するために、特定のコード例を通して説明します。

サンプル コードは次のとおりです。

package main

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

func main() {
    var count int32

    // 使用sync.WaitGroup等待goroutine执行完毕
    var wg sync.WaitGroup
    wg.Add(2)

    // 第一个goroutine执行count++,循环10万次
    go func() {
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            count++
        }
    }()

    // 第二个goroutine执行count--,循环10万次
    go func() {
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            count--
        }
    }()

    // 等待goroutine执行完毕
    wg.Wait()

    // 输出最终的count值
    fmt.Println(count)
}

上記のサンプル コードでは、int32 型変数 count を作成し、count に 2 つのゴルーチンを定義しました。 加算と減算の演算を実行します。各ゴルーチンは 100,000 回ループします。

count および count-- 操作はアトミックではないため、複数のゴルーチンが同時に count を変更するとデータが表示される可能性があります。問題。変数代入操作がアトミックである場合、最終的な count 値は 0 である必要があります。

変数代入操作のアトミック性を確保するために、代わりに sync/atomic パッケージの AddInt32 関数と SubInt32 関数を使用できます。 count および count-- 操作のコード変更は次のとおりです。

package main

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

func main() {
    var count int32

    // 使用sync.WaitGroup等待goroutine执行完毕
    var wg sync.WaitGroup
    wg.Add(2)

    // 第一个goroutine执行count++,循环10万次
    go func() {
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            atomic.AddInt32(&count, 1)
        }
    }()

    // 第二个goroutine执行count--,循环10万次
    go func() {
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            atomic.AddInt32(&count, -1)
        }
    }()

    // 等待goroutine执行完毕
    wg.Wait()

    // 输出最终的count值
    fmt.Println(count)
}

上記の変更により、atomic.AddInt32 を使用します。変数代入操作のアトミック性を保証する関数。コードを変更すると、count の最終出力値は 0 になり、変数代入操作がアトミックであることがわかります。

要約すると、Go 言語では変数代入操作はアトミックではありませんが、sync/atomic パッケージのアトミック操作を使用して変数代入のアトミック性を確保できます。

以上がGolang では変数の代入はアトミックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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