如何在 Golang 中使用原子函数修复种族条件?
原文:https://www . geesforgeks . org/如何使用 golang 中的原子函数修复比赛条件/
在一个系统中执行的两个或多个进程,如果有并发和访问共享数据的错觉,可能会试图同时更改共享数据。系统中的这种情况称为竞争情况。要查看 Golang 中比赛状态的示例代码,可以参考这篇文章。 Golang 中的原子包提供了低级锁定机制,用于同步对指针和整数等的访问。原子/同步包功能用于修复争用情况。
示例:
// Golang program to fix the race
// condition using atomic package
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic"
)
// All goroutines will increment variable c
// waitgroup is waiting for the completion
// of program.
var (
c int32
waitgroup sync.WaitGroup
)
func main() {
// with the help of Add() function add
// one for each goroutine
// a count of total 3
waitgroup.Add(3)
// increment with the help
// of increment() function
go increment("geeks")
go increment("for")
go increment("geeks")
// waiting for completion
// of goroutines.
waitgroup.Wait()
// print the counter
fmt.Println("Counter:", c)
}
func increment(name string) {
// Done() function used
// to tell that it is done.
defer waitgroup.Done()
for range name {
// Atomic Functions
// for fix race condition
atomic.AddInt32(&c, 1)
// enter thread in the line by line
runtime.Gosched()
}
}
输出:
Counter: 13
在这里,你可以看到我们正在使用原子。AddInt32() 函数同步整数值的相加,这样一次只允许一个 goroutine 完成相加操作。记住一件事,总是使用在线编译器检查这样一个程序的输出,因为由于确定性的本质,你可能每次都得到相同的输出(意味着没有竞争条件)。所以使用像 Visual Studio 或 CMD 这样的本地编译器来查看结果。
版权属于:月萌API www.moonapi.com,转载请注明出处