Go 言語は並行プログラミング言語として、開発者が並行性の問題に対処できるようにする豊富な同期メカニズムを提供します。これらの同期メカニズムを習得することは、同時プログラミング スキルを向上させるために非常に重要です。この記事では、読者がこれらのメカニズムをよりよく理解して使用できるように、特定のコード例を通じて Go 言語の一般的な同期メカニズムをいくつか説明します。
Mutex は、共有リソースが複数の goroutine によって同時にアクセスされないように保護するために使用される基本的な同期メカニズムです。以下は簡単なミューテックス ロックの例です。
package main import ( "fmt" "sync" ) var ( counter int mutex sync.Mutex ) func incrementCounter() { mutex.Lock() defer mutex.Unlock() counter++ } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() incrementCounter() }() } wg.Wait() fmt.Println("Counter:", counter) }
上記の例では、sync.Mutex
を使用して counter
変数への同時アクセスを保護し、各変数が確実にアクセスできるようにします。 incrementCounter()
関数を実行できる goroutine は 1 つだけです。
チャネルは、Go 言語のゴルーチン間の通信に使用されるメカニズムであり、データの転送と同時実行性の制御に使用できます。簡単なチャネルの例を次に示します。
package main import "fmt" func sendData(ch chan<- int) { for i := 0; i < 5; i++ { ch <- i } close(ch) } func receiveData(ch <-chan int) { for v := range ch { fmt.Println("Received:", v) } } func main() { ch := make(chan int) go sendData(ch) receiveData(ch) }
上記の例では、チャネル ch
を介して 2 つのゴルーチン間でデータが受け渡されます。 sendData()
関数はチャネルにデータを送信し、receiveData()
関数はチャネルからデータを受信し、range
を介してチャネル内のデータを走査します。
条件変数は、ゴルーチン間で待機または通知するためのメカニズムであり、複雑な同期ロジックを実装するためによく使用されます。以下は、簡単な条件変数の例です。
package main import ( "fmt" "sync" ) var ( done bool cond *sync.Cond mutex sync.Mutex ) func worker1() { mutex.Lock() for !done { cond.Wait() } mutex.Unlock() fmt.Println("Worker 1: Done") } func worker2() { mutex.Lock() done = true cond.Signal() mutex.Unlock() fmt.Println("Worker 2: Signaled") } func main() { cond = sync.NewCond(&mutex) go worker1() go worker2() }
上記の例では、2 つのゴルーチン間の関係は、条件変数 cond
とミューテックス ロック mutex
を通じて実装されています。同期。 worker1()
関数は、done
変数がtrue
になるまで待機してから実行を続行します。worker2()
関数設定done
変数は true
で、シグナルを worker1()
に送信します。
上記の例を通じて、読者の皆様が Go 言語の同期メカニズムをより深く理解し、実際のプロジェクトで柔軟に使用して並行プログラミング スキルを向上できることを願っています。
以上がGo 言語の同期メカニズムをマスターする: 同時プログラミング スキルを向上させるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。