runtime.LockOSThread是否允许子goroutines在相同的OS线程中运行?

joa*_*nrb 9 go

据我所知,在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线程中执行还是只在第一个执行?

Ain*_*r-G 6

我们可以使用 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。补充,现在结果各不相同。


thw*_*hwd 5

文档runtime.LockOSThread说:

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

(强调我的)

这意味着,如果Go的某个实现实现了您的要求,那将是错误的。

需要说明的是:goroutine是否保留了一个线程,而另一个goroutine在同一线程上执行了;那就错了。