1. 程式人生 > 其它 >golang,函式引數傳遞的sync.Mutex不是指標會怎麼樣

golang,函式引數傳遞的sync.Mutex不是指標會怎麼樣

package main

import (
"fmt"
"sync"
)
var a = 1
func main() {
lock := sync.Mutex{}
wg := &sync.WaitGroup{}
wg.Add(2)
go t(lock,wg)
go t(lock,wg)
wg.Wait()
fmt.Println(a)
}

func t(lock sync.Mutex, wg *sync.WaitGroup){
defer wg.Done()
lock.Lock()
defer lock.Unlock()
for i:=0;i<10000000;i++{
a++
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
輸出
11380825

修正
程式碼
package main

import (
"fmt"
"sync"
)
var a = 1
func main() {
lock := &sync.Mutex{}
wg := &sync.WaitGroup{} // 改成指標
wg.Add(2)
go t(lock,wg)
go t(lock,wg)
wg.Wait()
fmt.Println(a)
}

func t(lock *sync.Mutex, wg *sync.WaitGroup){ // 改成指標
defer wg.Done()
lock.Lock()
defer lock.Unlock()
for i:=0;i<10000000;i++{
a++
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
結果
20000001

這才是正確的結果

結論
函式引數傳遞sync.Mutex一定要是指標
————————————————
版權宣告:本文為CSDN博主「cumt_TTR」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/cumt_TTR/article/details/112387024