要約すると、Go のチャネルと同期プリミティブは同時プログラミングにおいて重要なツールです。チャネルはデータを安全に交換するために使用され、同期プリミティブはゴルーチンの同時実行を制御するために使用されます。具体的には、チャネルによりゴルーチンがデータを渡すことができ、ミューテックスにより共有リソースが保護され、条件変数は条件が true になるまで待機し、イベントはゴルーチンの同期に使用されます。これらのメカニズムを使用することで、開発者は効率的でスケーラブルな同時アプリケーションを作成できます。
Go 同時プログラミング: チャネルと同期プリミティブの使用
Go のチャネルと同期プリミティブは、同時プログラミングを実装するための重要なツールです。この記事では、両方のメカニズムの使用法を検討し、実際の例を通じてその威力を実証します。
チャネル
チャネルは、同時実行の Goroutine 間でデータを安全に交換するために使用されるメカニズムです。これはパイプに似ており、データを一方の端から書き込み、もう一方の端から読み取ることができます。
// 声明一个用于传递整数的通道 channel := make(chan int) // 在一个 Goroutine 中写入通道 go func() { channel <- 42 }() // 在另一个 Goroutine 中读取通道 value := <-channel
同期プリミティブ
同期プリミティブは、Goroutine の同時実行を制御するための一連のツールです。これらには、ロック、ミューテックス、条件変数、イベントなどが含まれます。
Mutex lock
Mutex ロックは、同時に 1 つの Goroutine だけが共有リソースにアクセスすることを保証するために使用されます。
// 声明一个互斥锁 var mu sync.Mutex // 在一个 Goroutine 中使用互斥锁保护共享资源 func incrementCounter() { mu.Lock() defer mu.Unlock() counter++ }
条件変数
条件変数は、特定の条件が真になるのを待つために使用されます。 Goroutine は、条件が満たされるまで条件変数を待ってから実行を続行できます。
// 声明一个条件变量 var cv sync.Cond // 在一个 Goroutine 中等待条件 func waitForCondition() { cv.L.Lock() for !condition { cv.Wait() } cv.L.Unlock() } // 在另一个 Goroutine 中唤醒等待条件的 Goroutine func signalCondition() { cv.L.Lock() condition = true cv.Broadcast() cv.L.Unlock() }
実際的なケース
チャネルを使用してタスクを並列処理する
一般的な同時実行の問題は、タスクの並列処理です。この問題は、結果を計算して結果をチャネルに入れるゴルーチンのセットを作成することで解決できます。
// 生成任务列表 tasks := []func() int{ func() int { return 1 }, func() int { return 2 }, func() int { return 3 }, } // 创建一个通道来接收结果 results := make(chan int) // 创建 Goroutine 来计算任务 for _, task := range tasks { go func(task func() int) { results <- task() }(task) } // 从通道中接收结果 for i := 0; i < len(tasks); i++ { result := <-results fmt.Println(result) }
ミューテックス ロックを使用して共有状態を保護します
もう 1 つの一般的な同時実行の問題は、共有状態の保護です。この問題は、ミューテックスを使用して、同時に 1 つの Goroutine だけが共有状態にアクセスできるようにすることで解決できます。
りー以上がGo 同時プログラミング: チャネルと同期プリミティブの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。