首页 > 解决方案 > WaitGroup 不受双重尊重

问题描述

我正在关注不同的示例教程,我在嵌套两个循环时遇到问题。

我想要的是

sum变量必须给出 2500

结果

总和 = 2298、2266、2254

就像循环没有给你时间结束

package main

import (
    "fmt"
    "sync"
    "time"
)

var iterate = 50
var sum = 0

func main() {

    timeStart := time.Now()

    var wg sync.WaitGroup

    for i := 0; i < iterate; i++ {

        for i2 := 0; i2 < iterate; i2++ {

            wg.Add(1)

            go func() {

                defer wg.Done()

                sum++

                time.Sleep(5 * time.Millisecond)

            }()

        }

    }

    wg.Wait()

    timeEnd := time.Now().Sub(timeStart)

    fmt.Println(timeEnd, sum)

}

标签: loopsfor-loopgoasynchronous

解决方案


正如评论中指出的那样。sum应使用sync.Mutex, 更改前锁定sum和解锁后进行保护。如下所示修改后的代码将打印出 2500。

package main

import (
    "fmt"
    "sync"
    "time"
)

var iterate = 50
var sum = 0

func main() {


    m := sync.Mutex{}

    timeStart := time.Now()

    var wg sync.WaitGroup

    for i := 0; i < iterate; i++ {

        for i2 := 0; i2 < iterate; i2++ {

            wg.Add(1)

            go func() {

                defer wg.Done()

                m.Lock()
                sum++
                m.Unlock()

                time.Sleep(5 * time.Millisecond)

            }()

        }

    }

    wg.Wait()

    timeEnd := time.Now().Sub(timeStart)

    fmt.Println(timeEnd, sum)

}

推荐阅读