goroutine 修改全局變量無效問題

 

原文:https://studygolang.com/topics/7050golang

 

 

go修改全局變量的問題安全

測試 goroutine 修改全局變量,有x y 兩個全局函數,分別在兩個 goroutine f1() 和 f2() 中修改(f1()修改x,f2()修改y),f2() 只多了一行sleep,爲何最終主 goroutine 打印y時,y的值一直是0?? 代碼以下markdown

package main

import (
    "fmt"
    "runtime"
    "time"
)

var x, y int

func main() {
    runtime.GOMAXPROCS(3)
    go f1()
    go f2()
    for {
        time.Sleep(time.Second * 1)
        fmt.Println("x:", x, "y", y)
    }
}

func f1() {
    for {
        x = x + 1
        time.Sleep(time.Second * 1)
    }
}

func f2() {
    for {
        y = y + 1
    }
}

  

結果:函數

 

 

個人理解是這樣的,不知道是否合理。 爲了效率,對內存的寫入通常會在每個處理器中緩衝,並在必要時一塊兒flush到主存。而f2沒有Sleep,致使一直沒有時間片去flush到主存,f1有Sleep,就會flush到主存,因此x值會變化,y的值沒變化。測試

若是runtime.GOMAXPROCS(1),都不會有打印信息出來。被f2獨佔spa

能夠這樣修改,就會變化code

package main

import (
    "fmt"
    "runtime"
    "time"
)

var x, y int

func main() {
    fmt.Println(runtime.NumCPU())
    runtime.GOMAXPROCS(3)
    go f1(&x)
    go f2(&y)
    for {
        time.Sleep(time.Second * 1)
        fmt.Println("x:", x, "y", y)
    }
}

func f1(x *int) {
        for {
                *x = *x + 1
                time.Sleep(time.Second * 1)
        }
}

func f2(y *int) {
        for {
                *y = *y + 1
        }
}
smokezl
smokezl · #2 · 7月以前

1樓 @darren3126 對的,我以爲應該是這樣,f1 和 f2 若是都不sleep 的話,至關於分別都獨佔了M,沒有機會寫主存 </br>我也測試過,若是是傳址的話,值確實會被修改,感謝大神~協程

TOMFATCAT
TOMFATCAT · #3 · 7月以前

這徹底是爲了安全,若是你想改變全局變量,能夠把它塞到chan裏面,要在通訊裏共享內存,大概是這麼理解的,否則全部協程一塊去寫同一塊內存,不加鎖還,很容易寫花的blog

package main

import (
    "fmt"
    "runtime"
    "time"
)

var x, y int

func main() {
    fmt.Println(runtime.NumCPU())
    runtime.GOMAXPROCS(3)
    x = 100
    y = 33
    go f1(&x)
    go f2(&y)
    for {
        time.Sleep(time.Second * 1)
        fmt.Println("x:", x, "y", y)
    }
}

func f1(x *int) {
        for {
                *x = *x + 1
                time.Sleep(time.Second * 1)
        }
}

func f2(y *int) {
        for {
                *y = *y + 1
        }
}
                                                       
相關文章
相關標籤/搜索