コルーチンは軽量スレッドの作成と切り替えに使用され、ロックは共有データへのアクセスを同期するために使用されます。コルーチンがロックと対話する主な方法は、ロックを使用して、複数のコルーチンによってアクセスされる共有データの一部であるクリティカル セクションを保護することです。ミューテックス ロックを使用して、一度に 1 つのコルーチンのみがクリティカル セクションにアクセスできるようにすることも、読み取り/書き込みロックを使用して、複数のコルーチンが同時にクリティカル セクションを読み取ることを許可し、書き込みは 1 つのコルーチンのみに許可することもできます。実際には、ロックを使用して、Web サーバーのサーバー状態への同時アクセスとデータベース行データの更新操作を保護できます。
Coroutine
Coroutine は、コルーチンのオーバーヘッドです。作成と切り替えはスレッドに比べて非常に低いです。 Go では、コルーチンは goroutine
キーワードを使用して作成されます。
ロック
ロックは、共有データへのアクセスを同期し、同時アクセスによるデータの不整合を防ぐために使用されます。 Go には、次の組み込みロックがあります。
sync.Mutex
: 一度に 1 つのコルーチンがクリティカル セクションにアクセスできるようにするミューテックス ロック。 sync.RWMutex
: 読み取り/書き込みロックにより、複数のコルーチンがクリティカル セクションを同時に読み取ることができますが、クリティカル セクションに書き込むことができるのは 1 つのコルーチンのみです。 sync.Once
: コード ブロックが 1 回だけ実行されるようにする 1 回限りのロック。 コルーチンとロックの間の相互作用
コルーチンとロックの間の最も一般的な相互作用は、重要なセクションを保護するためにロックを使用することです。クリティカル セクションとは、共有データにアクセスするコードの部分を指します。
ロックを使用してクリティカル セクションを保護するには、クリティカル セクションの前にロックを取得し、クリティカル セクションの後にロックを解放する必要があります。ミューテックス ロックと読み取り/書き込みロックの場合、Lock()
メソッドと Unlock()
メソッドを使用してロックを取得および解放できます。
import ( "sync" ) var mu sync.Mutex var counter int func incrementCounter() { mu.Lock() counter++ mu.Unlock() }
上の例では、counter
変数のインクリメント操作を incrementCounter
関数に入れ、ミューテックス ロック mu
を使用して、それを守ってください。これにより、一度に 1 つのコルーチンだけが counter
変数にアクセスして変更できるようになります。
実際的なケース
Web サーバー
Web サーバーでは、複数のコルーチンが異なる HTTP を同時に処理できます。 。複数のコルーチンが同時にサーバー状態 (現在の接続数など) にアクセスするのを防ぐために、ミューテックスを使用してサーバー状態へのアクセスを保護できます。
データベース アクセス
データベース アクセスでは、複数のコルーチンが同時にデータベースにクエリを実行できます。複数のコルーチンが同じデータ行を同時に更新するのを防ぐために、読み取り/書き込みロックを使用してデータベース行データの更新操作を保護できます。読み取り操作は同時に実行できますが、書き込み操作には排他的アクセスが必要です。
以上がGolang コルーチンとロック間の相互作用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。