📜  如何在 Golang 中使用原子函数修复竞争条件?

📅  最后修改于: 2021-10-24 14:08:32             🧑  作者: Mango

在一个系统中执行的两个或多个进程具有并发错觉并访问共享数据可能会尝试同时更改共享数据。系统中的这种情况称为竞争条件。 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 来查看结果。