1 答案:
package main
import (
"fmt"
"sync/atomic"
"time"
)
func main() {
var count uint32
trigger := func(i uint32, fn func()){
for{
if n := atomic.LoadUint32(&count); n == i {
fn()
atomic.AddUint32(&count, 1)
// count++
break
}
time.Sleep(time.Nanosecond)
}
}
for i := uint32(0); i <100; i++ {
go func(index uint32) {
fn := func() {
fmt.Println(index)
}
trigger(index, fn)
}(i)
}
trigger(100, func() {})
}
2 解释为什么使用 atomic操作 count?
答案: 如果不适用atomic保证原子性,会出先count++,执行到一半的情况cpu被调度下线,而此时count的值可能是不确定的,比如 200,导致等待200的线程先打印。不符合预期。