据我所知,在Go中,runtime.LockOSThread()将goroutine绑定到一个OS线程,不允许其他goroutine在该线程中执行.儿童goroutines也是如此吗?
例如:
runtime.LockOSThread()
go func() {
go func() {
// Do something
}()
// Do something
}()
Run Code Online (Sandbox Code Playgroud)
这两个goroutine都是在一个独占的OS线程中执行还是只在第一个执行?
我们可以使用 pthread.h 来检查它pthread_self:
package main
// #include <pthread.h>
import "C"
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
ch1 := make(chan bool)
ch2 := make(chan bool)
fmt.Println("main", C.pthread_self())
go func() {
runtime.LockOSThread()
fmt.Println("locked", C.pthread_self())
go func() {
fmt.Println("locked child", C.pthread_self())
ch1 <- true
}()
ch2 <- true
}()
<-ch1
<-ch2
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,它打印出这样的东西,main而且locked总是有时相同,但有时不同:
main 139711253194560
locked 139711219787520
locked child 139711236572928
Run Code Online (Sandbox Code Playgroud)
编辑我忘记了 GOMAXPROCS。补充,现在结果各不相同。