首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Go的LockOSThread不锁定这个操作系统线程?

为什么Go的LockOSThread不锁定这个操作系统线程?
EN

Stack Overflow用户
提问于 2016-05-24 17:42:34
回答 4查看 2.8K关注 0票数 9

The documentation for runtime.LockOsThread声明:

LockOSThread将调用goroutine连接到其当前操作系统线程。在调用goroutine退出或调用UnlockOSThread之前,它将始终在该线程中执行,而其他任何goroutine都无法执行。

但考虑一下这个项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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连接到GOMAXPROCS设置的一个可用OS线程,因此我预计在main第3行上创建的goroutine不会运行。但相反,程序打印This shouldn't run,暂停1秒,然后退出。这一切为什么要发生?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-24 20:08:54

来自 package documentation

GOMAXPROCS变量限制可以同时执行用户级Go代码的操作系统线程的数量。代表Go代码在系统调用中可以阻塞的线程数量没有限制;这些线程不包括GOMAXPROCS限制.

休眠线程不计算为1的GOMAXPROCS值,因此Go可以自由地让另一个线程运行fmt.Println goroutine。

票数 7
EN

Stack Overflow用户

发布于 2016-05-25 06:25:33

这里有一个Windows示例,它可能会帮助您了解正在发生的事情。它打印运行goroutines的线程It。必须使用syscall,所以它只能在Windows上工作。但您可以轻松地将其移植到其他系统。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "runtime"
    "golang.org/x/sys/windows"
)

func main() {
    runtime.GOMAXPROCS(1)
    runtime.LockOSThread()
    ch := make(chan bool, 0)
    go func(){
        fmt.Println("2", windows.GetCurrentThreadId())
        <- ch
    }()
    fmt.Println("1", windows.GetCurrentThreadId())
    <- ch
}

我不使用睡眠来防止运行时生成另一个用于睡眠猩猩的线程。通道将阻塞并移除运行队列中的goroutine。如果执行代码,您将看到线程ID是不同的。主goroutine锁定了其中一个线程,因此运行时必须生成另一个线程。

正如您已经知道的,GOMAXPROCS并不阻止运行时生成更多的线程。GOMAXPROCS是关于可以并行执行goroutines的线程数的更多信息。但是可以为等待syscall完成的goroutines创建更多的线程,例如。

如果删除runtime.LockOSThread(),您将看到线程ID是相等的。这是因为通道读取阻止了goroutine,并允许运行时将执行交付给另一个goroutine,而无需生成新线程。这就是即使在GOMAXPROCS为1时多个goroutines也可以并发执行的方式。

票数 1
EN

Stack Overflow用户

发布于 2020-09-16 16:08:59

GOMAXPROCS(1),它会使您有一个活动的M (OS线程)来服务器go例程(G)。

在您的程序中有两个Go例程,一个是main,另一个是fmt.Println。由于main例程处于睡眠状态,M可以自由运行任何go例程,在本例中,fmt.Println可以运行这些例程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37426511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文