関数とゴルーチンは次の方法で通信できます: ミューテックス ロック: 共有リソースを保護するために使用されます 条件変数: 条件を満たすゴルーチンを通知するために使用されます チャネル: データ転送バッファ アトミック変数: ロックフリーの同時アクセス変数 実際のケース: 並列Goroutine を使用してコンピューティング集約型タスクの実行効率を向上させるタスクの処理には、具体的には、タスクの作成、Goroutine 処理タスクの開始、および処理結果の収集の 3 つのステップが含まれます。
Go 言語における関数とゴルーチン間の通信方法
Go 言語では、関数とゴルーチンは次の通信を渡すことができます。 3 つの方法:
1. ミューテックス ロック (ミューテックス)
ミューテックス ロックは、共有リソースを保護し、同時に 1 つの Goroutine だけがリソースにアクセスできるようにするために使用されます。 。
var mu sync.Mutex // 全局互斥锁 func increment(i *int) { mu.Lock() *i++ mu.Unlock() }
2. 条件変数 (Cond)
条件変数は、指定された条件が満たされた場合に待機中のゴルーチンに通知するために使用されます。
var cond sync.Cond // 全局条件变量 func wait(c *sync.Cond, i *int) { c.L.Lock() for { if *i == 0 { c.Wait() } break } c.L.Unlock() }
3. チャネル
チャネルは、ゴルーチン間でデータを送信するために使用されるバッファです。
var ch = make(chan int, 10) // 创建容量为 10 的通道 func send(c chan int, i int) { c <- i // 发送数据 } func receive(c chan int) { v := <-c // 接收数据 }
4. アトミック変数
アトミック変数は、ロックなしで同時にアクセスできます。
var atomicInt int64 func incrementAtomic(i *int64) { atomicInt++ }
実用的なケース: タスクの並列処理
次に、Goroutine を使用してタスクを並列処理する実際のケースを示します。タスクを並列処理すると、特に計算量の多いタスクの場合、プログラムの実行効率が大幅に向上します。
以上がgolang 関数が goroutine と通信する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。