该文档的runtime.LockOsThread
状态:
LockOSThread将调用goroutine连接到其当前的操作系统线程。在调用goroutine退出或调用UnlockOSThread之前,它将始终在该线程中执行,其他goroutine无法执行。
但是请考虑以下程序:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
runtime.LockOSThread()
go fmt.Println("This shouldn't run")
time.Sleep(1 * time.Second)
}
该main
goroutine连接到设置的一个可用OS线程上GOMAXPROCS
,因此我希望在第3行创建的goroutine main
将不会运行。但是相反,程序会打印This shouldn't run
,暂停1秒钟,然后退出。为什么会这样?
GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程的数量。对于代表Go代码的系统调用中可以阻止的线程数量没有限制;那些不计入GOMAXPROCS限制。
休眠线程不计入GOMAXPROCS
值1,因此Go可以自由地让另一个线程运行fmt.Println
goroutine。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句