首页 > 解决方案 > 如何修复golang中的竞争条件?

问题描述

我正在尝试修复 golang 中的竞争条件,我使用了等待组,正如你所看到的,我添加了两个等待组并调用了 Done()。但仍然没有预期的输出。

package main

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

var counter int = 0

func task(m string, n int,  wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0 ; i < 100 ; i++ {
        counter = n
        time.Sleep(100000)
        fmt.Println(m, counter)
        counter = 0
    }
}

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go task("first", 1, &wg) // i want "first" task should get always 1
    wg.Add(1)
    go task("second", 2, &wg) // // i want "second" task should get always 2
    wg.Wait()
}

以上程序输出

second 1
first 1
first 1
second 1
first 2
second 2
second 2
...

预期产出

second 2
first 1
first 1
second 2
first 1
second 2
second 2
...

标签: gorace-conditiongoroutine

解决方案


对于正在寻找如何在 golang 中使用 sync.Mutex 进行同步的任何人。这可能会有所帮助。如果此解决方案不正确,请发表评论或回复。

package main

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

var counter int = 0

func task(m string, n int,  wg *sync.WaitGroup, mux *sync.Mutex) {
    
    defer wg.Done()
    for i := 0 ; i < 100 ; i++ {
        mux.Lock()
        //your shared resource
        counter = n
        time.Sleep(100000)
        fmt.Println(m, counter)
        counter = 0
        //end of your shared resource
        mux.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup
    var mux sync.Mutex
    wg.Add(1)
    go task("first", 1, &wg, &mux)
    wg.Add(1)
    go task("second", 2, &wg, &mux)
    wg.Wait()
}

推荐阅读