簡體   English   中英

切片結構中的鎖

[英]Go Locks in a slice of struct

我是GO的新手。 我專門嘗試使用鎖將值並行添加到數組中(我不想使用通道)。 但是以某種方式我的答案是不正確的。 我已經嘗試了兩種方法。 將指針傳遞給slice並傳遞slice本身。 我不是在尋找全局鎖定變量。

方法1(傳遞指針)

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);
}

方法2(傳遞切片)

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);
}

兩種情況下輸出都不正確。

看來您使用的是正確的鎖,但是在打印arr之前沒有等待goroutine結束。 嘗試添加一個小的<-time.After(time.Second) ,或者使用WaitGroup,或者使用select等待所有goroutine完成,或者將fmt.Println(ar[i].population)放在goroutine中以查看您想看的結果!

如果您只是啟動一堆goroutine而無需等待它們完成,也會發生同樣的事情。

這是一個完整的工作示例,為清楚起見,每個goroutine都帶有一個額外的“ id”。 請注意,goroutines的順序不一致!

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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM