在一个系统中执行的两个或多个进程具有并发错觉并访问共享数据可能会尝试同时更改共享数据。系统中的这种情况称为竞争条件。 Golang中Race Condition的示例代码可以参考这篇文章。
Golang 中的 Atomic 包提供了用于同步访问指针和整数等的低级锁定机制。 atomic/sync 包函数用于修复竞争条件。
例子:
// 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
在这里,您可以看到我们使用atomic.AddInt32()函数来同步整数值的添加,以便一次只允许一个 goroutine 完成添加操作。请记住一件事,始终使用在线编译器检查此类程序的输出,因为由于确定性,您每次都可能获得相同的输出(意味着没有竞争条件)。所以使用本地编译器如 Visual Studio 或 CMD 来查看结果。