ホームページ >バックエンド開発 >Golang >マルチスレッド環境でミューテックスはどのようにターゲットリソースをロックしますか?

マルチスレッド環境でミューテックスはどのようにターゲットリソースをロックしますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-01 06:14:30591ブラウズ

How Does a Mutex Lock Target Resources in a Multi-Threaded Environment?

ミューテックス ロックのターゲット設定: 詳細な調査

マルチスレッド環境では、ミューテックスは共有リソースへのアクセスを調整する上で重要な役割を果たし、データの整合性と競合状態の防止。ただし、ミューテックスがロックする変数をどのように決定するかを理解することは、同時実行性を習得する上で極めて重要なステップとなります。

次のコード例を考えてみましょう。

<code class="go">var state = make(map[int]int)
var mutex = &sync.Mutex{}
var readOps uint64
var writeOps uint64

// Start 100 goroutines to perform repeated reads on state
for r := 0; r < 100; r++ {
    go func() {
        total := 0
        for {
            key := rand.Intn(5)
            mutex.Lock()
            total += state[key]
            mutex.Unlock()
            atomic.AddUint64(&readOps, 1)

            time.Sleep(time.Millisecond)
        }
    }()
}</code>

このコードは単純であるにもかかわらず、次のような疑問を引き起こします。ミューテックスがどの変数をロックするかを知る方法。従来、ミューテックスは特定の変数のロックに関連付けられていましたが、この例では、ミューテックスとそれが保護する基礎となるデータの間に切断があるようです。

この動作を理解する鍵は、ミューテックスがロックすることを認識することにあります。変数ではなくリソースにアクセスします。これは、ミューテックスによって保護されているリソースにアクセスしようとするすべてのゴルーチンが最初にロックを取得する必要があることを意味します。

コード例では、ミューテックスは状態マップへのアクセスを同期します。ゴルーチンは状態マップの読み取りと変更を行うため、操作を実行する前にミューテックスを取得する必要があります。ミューテックスを取得すると、常に 1 つのゴルーチンだけが状態マップにアクセスできるようになり、同時変更が防止され、データの整合性が維持されます。

したがって、ミューテックスは特定の変数を直接ロックしませんが、ミューテックスは特定の変数を直接ロックするメカニズムを提供します。マップやデータ構造などの共有変数を含むリソースへのアクセスを制御します。共有リソースにアクセスする前にミューテックスを取得することで、プログラマは競合状態を効果的に防止し、コードの一貫性を確保できます。

以上がマルチスレッド環境でミューテックスはどのようにターゲットリソースをロックしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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