Go的LockOSThread为什么不锁定此OS线程?

问题:

该文档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)
}

maingoroutine连接到设置的一个可用OS线程上GOMAXPROCS,因此我希望在第3行创建的goroutine main将不会运行。但是相反,程序会打印This shouldn't run,暂停1秒钟,然后退出。为什么会这样?

user2357112支持Monica:

runtime包装文件

GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程的数量。对于代表Go代码的系统调用中可以阻止的线程数量没有限制;那些不计入GOMAXPROCS限制。

休眠线程不计入GOMAXPROCS值1,因此Go可以自由地让另一个线程运行fmt.Printlngoroutine。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章