```go
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
var ok bool
cpuNu := runtime.NumCPU()
for i := 0; i < cpuNu; i++ {
go func() {
for {
if ok {
// to do
}
}
}()
}
time.Sleep(3 * time.Second)
fmt.Println("Not print...why???")
}
```
并不是有函数调用就行,需要runtime.Gosched()。我贴一下我当时的代码,循环体内有调用函数的。
```go
func (c *RateLimitPerSec) Check() (ok bool) {
count := c.countRate
if count < c.rate {
ok = atomic.CompareAndSwapUint64(&c.countRate, count, count+1)
}
return ok
}
```
```go
cpuNu := runtime.NumCPU()
for i := 1; i < cpuNu; i++ {
go func() {
for {
ra.Check()
}
}()
}
```
#4
更多评论
在写个限速的库,原本是用锁来实现的一些操作,后来改成原子操作,跑基准测试的时候发现的。试过其他语言不会这样,我想这种特殊场景暴露出goroutine调度的问题,可能是个坑。
#2