标签: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