标签:nbsp 分享图片 wait group 技术分享 inf src 运行 var
package main
import (
"fmt"
)
func main() {
var a = 1
go func(num *int) {
for n := 0; n < 1000; n++ {
*num++
}
}(&a)
go func(num1 *int) {
for i := 0; i < 1000; i++ {
*num1++
}
}(&a)
fmt.Println(a)
}
发现执行结果输出为1,原因为主进程在创建完子线程后就结束了。子线程还未执行。也就没有对变量a进程运算

使用sync.WaitGroup等待子线程结束后退出。
package main
import (
"fmt"
"sync"
)
func main() {
var a int
var wg sync.WaitGroup
wg.Add(2)
go func(num *int) {
for n := 0; n < 100000; n++ {
*num++
}
wg.Done()
}(&a)
go func(num1 *int) {
for i := 0; i < 100000; i++ {
*num1++
}
wg.Done()
}(&a)
wg.Wait()
fmt.Println(a)
}




在运行多次后发现并不等于200000,而且每次都不同,原因为线程1在操作a变量时变量为0,运算的1,在运算过程中,线程b也读取a变量此时a还为1,也就造就了运算结果不一致问题。
此时就需要使用锁,sync.Mutex
package main
import (
"fmt"
"sync"
)
func main() {
var a int
var wg sync.WaitGroup
var lock sync.Mutex
wg.Add(2)
go func(num *int) {
for n := 0; n < 100000; n++ {
lock.Lock()
*num++
lock.Unlock()
}
wg.Done()
}(&a)
go func(num1 *int) {
for i := 0; i < 100000; i++ {
lock.Lock()
*num1++
lock.Unlock()
}
wg.Done()
}(&a)
wg.Wait()
fmt.Println(a)
}
执行多次后结果都是唯一的。


标签:nbsp 分享图片 wait group 技术分享 inf src 运行 var
原文地址:https://www.cnblogs.com/LC161616/p/9826076.html