学んだ!バッファリングされたチャネルをミューテックスとして使用する
同期パッケージは、ミューテックス ロックなどの基本的な同期プリミティブを提供します。 Once 型と WaitGroup 型を除き、他のほとんどの型は、基礎となる関数ライブラリ用に設計されています。より高いレベルの同期は、チャネルと通信を通じてより適切に実現されます。同時アクセスを許可する例の大部分では、問題を解決するためにミューテックスが使用されています。ただし、チャネルを使用して同期メカニズムを提供する方法を示す例はほとんどありません。そこで、この記事でそれについて説明しましょう。
ミューテックス ロックが機能するには、共有変数にアクセスするときにロックする必要があります。操作が完了したらロックを解除する必要があります。競合状態を避けるために、同じミューテックスを複数回ロックすることはできません。
受信者が存在しない場合、送信者はブロックします。同様に、送信者が存在しない場合、受信者はブロックします。ブロックします。この特性に基づいて、バッファリングされていないチャネルをロックとして使用することはできません。 バッファ チャネルをミューテックス ロックとして使用できるかどうかを見てみましょう。
バッファ サイズ 1 のチャネルには次の特性があります。バッファがいっぱいの場合は送信時にブロックされ、キャッシュが空の場合は送信時にブロックが解除されます。 明らかに、このチャネルのブロック特性は望ましいものです。ミューテックス ロックの特性と比較してください: バッファがいっぱいになったときにロックする<-->Buffer休暇<--> ロック解除 コードを通じてこの機能を実証してみましょう。
デモ: バッファ チャネルを「ロック」として使用する方法
バッファ チャネルに書き込む必要がある名前の列があると仮定します。ファイルには、それぞれの名前が連続して 1000 回書き込む必要があり、異なる名前間の重複は許可されません。
package main import ( "errors" "fmt" "os" "sync" ) func main() { file, err := os.Create("record.txt") defer func() { if err := recover(); err != nil { fmt.Printf("Error encounter: %w", err) } file.Close() }() if err != nil { panic(errors.New("Cannot create/open file")) } ss := []string{ //string slice literals "James", "Avery", "Peter", "John", "Beau", } chanLock := make(chan int, 1) //1 var wg sync.WaitGroup for _, str := range ss { //2 wg.Add(1) //amended thanks to response from Wang //Sheng go func(aString string) { chanLock <- 1 //3 for i := 0; i < 1000; i++ { file.WriteString(aString + "\n") } <-chanLock //4 wg.Done() //5 }(str) //pass by value } wg.Wait() }
上記のコードでは、 //1 バッファー 1 を持つチャネルを作成しました。 //2 名前の数と同じ数のゴルーチンを作成しました。 //3 はロックに相当し、 //4 はロック解除に相当します。そのため、複数のゴルーチンが同期的に Record.txt ファイルに名前を書き込むことができますが、ファイルを操作できるのは一度に 1 つのゴルーチンだけです。
サブゴルーチンがタスクを完了する前にメイン コルーチンが終了しないようにするために WaitGroup を使用していることに注意してください。
この記事がお役に立てば幸いです。コーディングをお楽しみください!
以上が学んだ!バッファリングされたチャネルをミューテックスとして使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...
