runtime.LockOSThread 是否允许子 goroutine 在同一个 OS

我知道在 Go 中,runtime.LockOSThread()会将一个 goroutine 绑定到一个 OS 线程,并且不允许其他 goroutine 在该线程中执行。这也适用于儿童 goroutines 吗?


例如:


runtime.LockOSThread()

go func() {

    go func() {

        // Do something

    }()

    // Do something

}()

这两个 goroutine 是在单个且独占的 OS 线程中执行还是仅在第一个线程中执行?


慕容森
浏览 251回答 2
2回答

慕标5832272

文档的runtime.LockOSThread说:LockOSThread将调用 goroutine 连接到其当前的操作系统线程。在调用 goroutine 退出或调用 UnlockOSThread 之前,它将始终在该线程中执行,而没有其他 goroutine 可以。(强调我的)这意味着如果 Go 的某个实现做了你所要求的,它就会出错。澄清:如果一个 goroutine 保留了一个线程并且另一个 goroutine 在同一线程上执行;那是错误的。

Smart猫小萌

我们可以使用 pthread.h 来检查它pthread_self:package main// #include <pthread.h>import "C"import (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "runtime")func main() {&nbsp; &nbsp; runtime.GOMAXPROCS(runtime.NumCPU())&nbsp; &nbsp; ch1 := make(chan bool)&nbsp; &nbsp; ch2 := make(chan bool)&nbsp; &nbsp; fmt.Println("main", C.pthread_self())&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; runtime.LockOSThread()&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("locked", C.pthread_self())&nbsp; &nbsp; &nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("locked child", C.pthread_self())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ch1 <- true&nbsp; &nbsp; &nbsp; &nbsp; }()&nbsp; &nbsp; &nbsp; &nbsp; ch2 <- true&nbsp; &nbsp; }()&nbsp; &nbsp; <-ch1&nbsp; &nbsp; <-ch2}在我的机器上,它打印出这样的东西,main而且locked总是有时相同,但有时不同:main 139711253194560locked 139711219787520locked child 139711236572928编辑我忘记了 GOMAXPROCS。补充,现在结果各不相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go