Go言語では、ロック機構をどのように実装しますか。
Go言語では、syncパッケージのMutex型を使用してロック機構を実装することができます。Mutexは排他制御ロックであり、クリティカルセクションを保護し、複数のgoroutineが同時に共有リソースにアクセスするのを防ぐことができます。
Mutexを使用してロックメカニズムを実装する例のコードが以下に示されています。
package main
import (
"fmt"
"sync"
"time"
)
var (
count int
lock sync.Mutex
)
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final count:", count)
}
func increment(wg *sync.WaitGroup) {
lock.Lock() // 加锁
defer lock.Unlock() // 解锁
defer wg.Done()
// 模拟耗时操作
time.Sleep(time.Millisecond * 100)
count++
}
上記のコードでは、まず、countというグローバル変数とMutex型のlock変数が作成されています。次に、increment関数内では、lock.Lock()メソッドを使用してクリティカルセクションをロックし、1つのgoroutineのみがクリティカルセクションに入ることを保証しています。クリティカルセクション内では、countを増やす操作が行われています。最後に、lock.Unlock()メソッドを使用してクリティカルセクションをアンロックしています。
上記のコードを実行すると、正確な増加結果が得られ、複数のゴールーチンが同時にクリティカルセクションにアクセスすることがないように確保され、ロック機構が実装されます。