goroutine种族条件
#网络开发人员 #go #goroutine

什么是种族条件?...

种族条件是一种条件,一个以上的goroutine同时访问相同的数据。原因是数据被混乱了,这是并发编程中的常见情况。

如何解决它?....

golang提供了一个称为sync.mutex的软件包,当发生竞赛条件时,只有一个goroutine才能访问数据,而穆特斯(Mutex)所有goroutines都可以访问数据,如何工作? Mutex可以使用锁定解锁函数

来控制数据流

让我们代码

A.估价种族条件

1.具有函数的启动变量以增加值

type counter struct {
    number int
}

func (value *counter) Add(param int) {
    value.number += param
}

2.使用Goroutines和sync.WaitGroup运行计数器功能


import (
    "fmt"
    "sync"
)

func main() {
    var counter counter
    wg := new(sync.WaitGroup)
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            for i := 0; i < 100; i++ {
                counter.Add(1)
            }
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(counter.number)
}

完整代码

package main

import (
    "fmt"
    "sync"
)

type counter struct {
    number int
}

func (value *counter) Add(param int) {
    value.number += param
}

func main() {
    var counter counter
    wg := new(sync.WaitGroup)
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            for i := 0; i < 100; i++ {
                counter.Add(1)
            }
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(counter.number)
}

使用此命令运行代码

go run -race main.go

add -race 标志是在我们的goroutine中检测种族条件,结果是:

Image description

检测到种族条件我们如何解决此问题 .....?

让我们解决

在这种情况下,使用sync.mutex软件包是最好的解决方案,因为我们可以在任务开始时锁定数据并在完成任务时解锁数据。

B.解决种族条件

1. ADD SYNC.MUTEX在计数器结构中

type counter struct {
    number int
    sync.Mutex
}

2.锁定数据

func (value *counter) Add(param int) {
    value.Lock()
    value.number += param
    value.Unlock()
}

3.运行代码

将无法检测到比赛条件,我们的问题解决了

go run -race main.go

结果是100000

结论
sync.Mutex是线程安全类型的,使用此软件包使我们的goroutines更安全,远离种族条件

不要惊慌和保持安全,谢谢