iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

golang初探系列 第 27

day27-Data Race

  • 分享至 

  • xImage
  •  

支持併發的程式語言當中,我們就會注意到資源競爭的問題,若沒有善用鎖可能會得到非預期的結果

我們用案例來解釋

Question

x 變數預期應該為 15000 ,我們可以看到輸出的結果並非預期 15000
原因在多併發的過程當中,goruntine 在拿取 x 變數的值,也有其他的 goruntine 對 x 進行寫入
導致 x 的值拿到舊值,故在獲取及寫入的時候要進行加鎖

package main

import (
	"fmt"
	"sync"
)

var x = 0
var wg sync.WaitGroup

func add() {
	for i := 0; i < 50000; i++ {
		x = x + 1
	}
	wg.Done()
}

func main() {

	wg.Add(3)
	go add()
	go add()
	go add()
	wg.Wait()
	fmt.Println(x)
}

由上案例的結果
那我們來使用官方提供的 Data Race Detector 來驗證是否真的發生資源競爭

資源競爭偵測

go run -race main.go

確實發現有顯示

https://ithelp.ithome.com.tw/upload/images/20200927/201296718xVgLnWDsp.png

Solution

可以使用 sync.Mutex 來進行上鎖、解鎖

package main

import (
	"fmt"
	"sync"
)

var x = 0
var wg sync.WaitGroup
var lock sync.Mutex

func add() {
	for i := 0; i < 50000; i++ {
		lock.Lock()
		x = x + 1
		lock.Unlock()
	}
	wg.Done()
}

func main() {

	wg.Add(3)
	go add()
	go add()
	go add()
	wg.Wait()
	fmt.Println(x)
}

資料補充:

用一個小例子談談 Golang 中的 Race Condition
Golang race detection


上一篇
day26-Reflect(反射) Package 介紹
下一篇
day28-Context介紹
系列文
golang初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言