【go】 面试题:多线程打印1-10 并要求顺序保证?

632 阅读1分钟

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的线程先打印。不符合预期。