前の例では、共有ステートへのアクセスを複数のgoroutineから同期する為に、明示的なロックにミューテックスを利用しました。その他の選択肢として、goroutineとチャネルに組み込まれている同期機能を使用して同じ結果を得ることもできます。このチャネルベースのアプローチでは、メモリを共有する方法を決定します。各データは、1つのgoroutineによって所有されます。 |
|
![]() ![]()
|
|
|
|
この例では、1つのgoroutineがステートを所有します。これにより、データは同時にアクセスされて破損することは決してありません。他のgoroutineは、ステートを読み書きするために、所有するgoroutineにメッセージを送信し、対応する応答を受信します。これらの |
|
|
|
以前のように、操作の回数をカウントします。 |
|
チャネル |
|
ここでは、goroutineが |
|
これは、100のgoroutineを開始して、 |
|
同様に、10の書き込みも開始します。 |
|
goroutineを1秒間動作させます。 |
|
最後に、opのカウントをキャプチャしてレポートします。 |
|
プログラムを実行すると、goroutineベースのステート管理の例では合計約80,000の操作が完了します。 |
|
この特定の場合、goroutineベースのアプローチはミューテックスベースのアプローチよりも少し複雑でした。ただし、他のチャネルが関与する場合や、そのような複数のミューテックスを管理する場合など、特定のケースでは役立つ可能性があります。特にプログラムの正しさの観点から、最も自然に感じられるアプローチを使用する必要があります。 |
次の例: ソート。