如何在golang中解决种族状况?

问题描述

我正在尝试修复golang中的竞赛条件,我使用了waitgroup,因为您可以看到我添加了两个waitgroup并调用了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
...

解决方法

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

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,&mux)
    wg.Wait()
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...