Go言語でMutexを使用してデータ読み書きの正確性を確保する方法は何ですか?

Go言語では、データの読み書きの正確性を保障するために、syncパッケージのMutex型を使用することができます。Mutexは相互排他ロックを意味し、LockメソッドとUnlockメソッドを提供しており、それぞれロックとアンロックに使用されます。以下は、Mutexを使用してデータの読み書きの正確性を保障する方法を示すサンプルコードです。

package main

import (
	"fmt"
	"sync"
	"time"
)

type Counter struct {
	mu    sync.Mutex
	count int
}

func (c *Counter) Increment() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.count++
}

func (c *Counter) Read() int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.count
}

func main() {
	counter := Counter{}
	wg := sync.WaitGroup{}

	// 启动多个goroutine并发地对计数器进行增加操作
	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			counter.Increment()
		}()
	}

	wg.Wait()

	// 读取计数器的值
	fmt.Println(counter.Read())
}

上記のコードでは、Counter型には、countフィールドの読み書き操作を保護するためにsync.Mutex型のフィールドmuが含まれています。Incrementメソッドは、countを増やすために使用され、Readメソッドはcountの値を読み取るために使用されます。

インクリメントとリードメソッドでは、まずc.mu.Lock()を使用してロックをかけ、メソッドの最後にc.mu.Unlock()を使用してロックを解除します。これにより、コードブロック内で1つのgoroutineしかcountフィールドにアクセスできないことが保証され、データの読み書きの正確性が確保されます。

main関数内で、100個の並行goroutineを起動して、カウンターを増やす操作を行い、最後にカウンターの値を読み取ります。Mutexを使用してロックおよびアンロックを行うため、複数のgoroutineが同時にカウンターを増やす場合でも、データ競合の問題は発生しません。最終的なカウンターの値は100になり、データの読み書きの正確性が確保されました。

bannerAds