go - Mutex 似乎没有正确锁定

标签 go concurrency mutex

我刚刚学习互斥。我以为下面的程序总共会返回 1000,但我得到的结果各不相同,所以我认为我做错了什么......

package main

import (
    "fmt"
    "sync"
)

var total int
var locker sync.RWMutex

func add() {
    for x := 1; x <= 100; x++ {
        locker.Lock()
        total += 1
        locker.Unlock()
    }
}

func main() {
    for x := 1; x <= 10; x++ {
        go add()
    }
    fmt.Printf("Total is %v\n", total)
}

最佳答案

Main 函数在 gorutines 完成它们的工作之前返回,你应该添加 sync.WaitGroup,这段代码如你所料:https://play.golang.com/p/_OfrZae0soB

package main

import (
    "fmt"
    "sync"
)

var total int
var locker sync.RWMutex

func add(wg *sync.WaitGroup) {
    defer wg.Done()
    for x := 1; x <= 100; x++ {
        locker.Lock()
        total += 1
        locker.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup
    for x := 1; x <= 10; x++ {
        wg.Add(1)
        go add(&wg)
    }
    wg.Wait()
    fmt.Printf("Total is %v\n", total)
}

关于go - Mutex 似乎没有正确锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49344303/

相关文章:

go - 处理多个网络客户端

go - 将多种方法之一包装在类型结构上?

go - 由于 slice 中的项目数正在变化,如何安全地从 slice 中删除项目

java - Java 中的信号量。为什么第二个线程不等待?

java - Java虚拟机上的数组分配和访问以及内存争用

java - ScheduledThreadPoolExecutor 和 corePoolSize 0?

c++ - 在 C++ 中销毁 pthread 互斥锁和去初始化顺序

mutex - 单词 "mutex"的复数形式

go - 如何使用 Gorm 将外键添加到模型中

c++ - 如何在类中使用 pthread_mutex 及其函数?