同時環境でクロージャを使用する場合、参照型クロージャ (参照型変数をキャプチャするクロージャ) は、変更すると元の変数に影響を与えるため、スレッドセーフである必要があります。参照型クロージャをスレッドセーフにする 2 つの主な方法は、ミューテックス ロックを使用する方法と、不変データ構造を使用する方法です。
Go では、クロージャはスコープ内の変数をキャプチャできます。 。これらのキャプチャされた変数はクロージャ変数と呼ばれます。同時環境でクロージャを使用する場合は、クロージャ変数のスレッド セーフを理解することが重要です。
クロージャ変数は、値型または参照型にすることができます。値の型はキャプチャ時にコピーされるため、クロージャ変数を変更しても元の変数には影響しません。ただし、参照型はキャプチャ時に参照されるため、クロージャ変数への変更は元の変数にも影響します。
次の例は、値型クロージャを示しています:
package main import "fmt" func main() { x := 10 f := func() { fmt.Println(x) } go f() }
この例では、クロージャ変数 x
は値型であるため、 #xx を変更しても、クロージャの外側にある元の変数には影響しません。
package main import "fmt" type Point struct { x, y int } func main() { p := Point{10, 20} f := func() { p.x = 30 } go f() }
p は参照型です。したがって、
p への変更は、クロージャの外側の元の変数にも影響します。したがって、参照型クロージャを同時に使用する場合は、クロージャへのアクセスがスレッドセーフであることを確認する必要があります。
ミューテックスを使用します: ミューテックス ロックにより、クロージャ変数への排他的アクセスが保証されます。次の例は、ミューテックスを使用して、クロージャが参照型変数を安全に変更できるようにする方法を示しています。
package main import ( "fmt" "sync" ) type Point struct { x, y int mux sync.Mutex } func main() { p := Point{10, 20} f := func() { p.mux.Lock() defer p.mux.Unlock() p.x = 30 } go f() }
不変データ構造の使用: 不変データ構造 データ セキュリティレプリケーションによって保証されます。次の例は、不変データ構造を使用して、クロージャが参照型変数に安全にアクセスできるようにする方法を示しています。
package main import ( "fmt" "sync" ) type Point struct { x, y int } func (p Point) UpdateX(x int) Point { return Point{x: x, y: p.y} } func main() { p := Point{10, 20} f := func() { p = p.UpdateX(30) } go f() }
以上がGolang クロージャのスレッド安全性に関する考慮事項の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。