Go でのデータ競合を回避する方法には、同期プリミティブ (ミューテックス ロック、読み取り/書き込みロックなど) を使用して共有データへのアクセスを制御する、アトミック操作を使用して同時実行安全なデータ構造を使用して操作のアトミック性を確保する、などがあります。 sync.Map、sync.WaitGroup など); 実際のケース: ミューテックス ロックを使用して count 変数でのデータ競合を回避し、一度に 1 つの goroutine のみが変数を変更できるようにします。
Go 関数の同時プログラミングでデータ競合を回避する方法
データ競合は、次の場合に発生します。複数の同時ゴルーチンが共有データに同時にアクセスします。 Go では、データ競合は次のようなさまざまな方法で回避できます。
atomic.AddInt32
やatomic.LoadUint64
など、さまざまなアトミック操作が提供されています。実際的なケース:
次の例は、ミューテックスを使用してデータの競合を回避する方法を示しています:
import ( "fmt" "sync" "sync/atomic" ) // 共享数据 var count int32 func increment() { // 获取互斥锁 mutex.Lock() defer mutex.Unlock() // 该行确保在函数退出时释放互斥锁 // 对共享数据进行修改 count++ } func main() { // 创建互斥锁 var mutex sync.Mutex // 并发执行 100 次 increment 函数 var wg sync.WaitGroup for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } // 等待所有 goroutine 完成 wg.Wait() // 输出最终计数 fmt.Println(atomic.LoadInt32(&count)) }
この場合、mutex
ミューテックス ロックは、一度に 1 つのゴルーチンだけがcount
変数にアクセスして変更できるようにするために使用され、それによってデータの競合を回避します。
以上がGolang 関数の同時プログラミングでデータ競合を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。