Golang は、デッドロックの問題を解決するために次の関数を提供します: sync.Mutex: ミューテックス ロック。保護されたリソースに同時に 1 つのスレッドのみがアクセスできるようにします。 sync.RWMutex: 読み取り/書き込みロック。複数のスレッドが同時にリソースを読み取ることを許可しますが、リソースに書き込むことができるのは 1 つのスレッドのみです。
デッドロックは、同時プログラミング、つまり 2 つ以上のプロセスまたはスレッドがそれぞれと競合する場合によく発生します。他のリソースは、プログラムがデッドロックに達する原因となります。 Golang にはデッドロックの問題を解決するための関数がいくつか用意されており、この記事では最も一般的に使用される関数を紹介します。
sync.Mutex
はミューテックス ロックで、保護されたリソースに同時に 1 つのスレッドだけがアクセスできるようにします。 sync.Mutex
を使用するための構文は次のとおりです。
import "sync" var mu sync.Mutex func main() { mu.Lock() // 访问受保护的资源 mu.Unlock() }
上記の例では、Lock()
メソッドは、ロックが解除されるまでスレッドをブロックします。 Unlock()
このメソッドはロックを解放し、他のスレッドが保護されたリソースにアクセスできるようにします。
sync.RWMutex
は、複数のスレッドが同時にリソースを読み取ることを許可しますが、1 つのスレッドのみに書き込むことを許可する読み取り/書き込みロックです。リソース。 sync.RWMutex
を使用するための構文は次のとおりです。
import "sync" var rwmu sync.RWMutex func main() { rwmu.RLock() // 读取受保护的资源 rwmu.RUnlock() rwmu.Lock() // 写入受保护的资源 rwmu.Unlock() }
上記の例では、RLock()
メソッドにより、複数のスレッドが同時にリソースを読み取ることができます。 ## Lock() メソッドは、ロックが解除されるまでスレッドをブロックします。
import "sync" var mu1 sync.Mutex var mu2 sync.Mutex func f1() { mu1.Lock() mu2.Lock() // ... } func f2() { mu2.Lock() mu1.Lock() // ... }この例では、関数
f1() および
f2 ( ) は 2 つのミューテックス ロックを競合しようとし、最終的にはデッドロックにつながります。
を使用します。
sync.Mutex を使用してデータベースへのアクセスを保護できます:
import ( "database/sql" "sync" ) var db *sql.DB var dbLock sync.Mutex func init() { db, _ = sql.Open("mysql", "root:password@localhost:3306/test") } func GetUserData(userID int) (*User, error) { dbLock.Lock() defer dbLock.Unlock() // 从数据库中查询用户数据 }By
sync.Mutex を使用すると、同時に 1 つのスレッドだけがデータベース接続にアクセスできるようになり、データベースに同時にアクセスするときに発生する可能性のあるデータの不整合などの問題を回避できます。
以上がGolang 関数を使用してデッドロックを解決する技術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。