package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
//使用sync.WaitGroup,启动10个goroutine,按顺序 打印0-9
var counter int32
func main(){
var wg sync.WaitGroup
wg.Add(10)
var i int32
for i = 0;i<10;i++{
go printNum(&wg,i)
time.Sleep(time.Nanosecond)
}
}
func printNum(wg *sync.WaitGroup,i int32){
if i == atomic.LoadInt32(&counter){
fmt.Println(i)
atomic.AddInt32(&counter,1)
wg.Done()
}
}
结果打印出1到9了。
各位大神,我写得是否符合题意?请帮忙点评,谢谢!
思路有点不对。
可以改为如下代码,自己比较一下差异。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
//使用sync.WaitGroup,启动10个goroutine,按顺序 打印0-9
var counter int32
func main(){
var wg sync.WaitGroup
wg.Add(10)
var i int32
for i = 0;i<10;i++{
go printNum(&wg,i)
time.Sleep(time.Nanosecond)
}
wg.Wait()
}
func printNum(wg *sync.WaitGroup,i int32){
for {
if i == atomic.LoadInt32(&counter){
fmt.Println(i)
atomic.AddInt32(&counter,1)
wg.Done()
break
}
time.Sleep(time.Nanosecond)
}
}
package main
import "sync"
type Val struct {
sync.Mutex
val int
}
func main() {
wg := sync.WaitGroup{}
v := &Val{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
v.Lock()
defer v.Unlock()
println(v.val)
v.val++
}()
}
wg.Wait()
}
提供另一种实现方式,可以参考下