Go 锁定一片结构

标签 go parallel-processing goroutine locks

我是 GO 的新手。我专门尝试使用锁将值并行添加到数组(我不想使用 channel )。但不知何故,我的回答是不正确的。我已经尝试了这两种方法。将指针传递给 slice 并传递 slice 本身。我不是在寻找全局锁变量。

方法一(传递指针)

type locks_block struct {
    population int
    mux sync.Mutex
}

func incr(ar *[] locks_block){

    for i:=0;i<len(*ar);i++ {

        (*ar)[i].mux.Lock()
        (*ar)[i].population = (*ar)[i].population+1;
        (*ar)[i].mux.Unlock()

    }
}

func main() {

    arr := make([]locks_block,5);

    go incr(&arr);
    go incr(&arr);
    go incr(&arr);
    go incr(&arr);


    fmt.Println(arr);
}

方法二(传 slice )

type locks_block struct {
    population int
    mux sync.Mutex
}

func incr(ar [] locks_block){

    for i:=0;i<len(ar);i++ {

        ar[i].mux.Lock()
        ar[i].population = ar[i].population+1;
        ar[i].mux.Unlock()

    }
}

func main() {

    arr := make([]locks_block,5);

    go incr(arr);
    go incr(arr);
    go incr(arr);
    go incr(arr);


    fmt.Println(arr);
}

两种情况下的输出都不正确。

最佳答案

看起来您正在正确使用锁,但在打印之前没有等待 goroutines“完成”arr .尝试添加一个小的 <-time.After(time.Second) ,或使用 WaitGroup,或使用 select等待所有 goroutines 完成,或者放置 fmt.Println(ar[i].population)在 goroutines 中查看你想要看到的结果!

如果你只是启动一堆 goroutines 而没有等待它们完成,也会发生同样的事情。

这是一个完整的工作示例,为清楚起见,每个 goroutine 都有一个额外的“id”。请注意,goroutine 的顺序不一致!

package main

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

type locks_block struct {
    population int
    mux        sync.Mutex
}

func incr(id int, ar []locks_block) {
    for i := 0; i < len(ar); i++ {
        ar[i].mux.Lock()
        ar[i].population = ar[i].population + 1
        fmt.Printf("goroutine #%v, population   %v\n", id, ar[i].population)
        ar[i].mux.Unlock()
    }
}

func main() {
    arr := make([]locks_block, 5)
    go incr(1, arr)
    go incr(2, arr)
    go incr(3, arr)
    go incr(4, arr)

    // this should give the goroutines enough time
    <-time.After(time.Millisecond * 500)
    fmt.Println(arr)
}

关于Go 锁定一片结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50186225/

相关文章:

go - 构建期间的模块依赖缓存问题

c++ - MPI_Scatter 一个二维数组在其他二维数组中

parallel-processing - react 性和弹性之间有什么区别?

pointers - Go指针交换问题

windows - 在 Windows 上安装 swaggo (swagger + gin)

arrays - println 在 go 中显示为空字符串

perl - 等待远程数据时读取STDIN;下载远程数据时终止

multithreading - 如何安全地与 Golang 中的 goroutine 中的 channel 交互

function - 从 goroutine 返回值会发生什么

concurrency - 计算/显示事件 goroutine 的数量