运行时.lockthread允许子程序在同一个操作系统线程中运行



我理解,在Go中,runtime.LockOSThread()将绑定一个运行例程到一个OS线程,而不允许在该线程中执行其他运行例程。对于子例程也是如此吗?

例如:

runtime.LockOSThread()
go func() {
    go func() {
        // Do something
    }()
    // Do something
}()

这两个例程是在一个独占的OS线程中执行还是只在第一个线程中执行?

runtime.LockOSThread的文档说:

LockOSThread将调用程序的连接到当前操作系统线程。在调用的线程程序退出或调用UnlockOSThread之前,它将始终在该线程中执行,并且没有其他线程程序可以

<一口>(强调我的)

这意味着如果Go的某个实现做了你要求的事情,它将是错误的。

澄清一下:如果一个线程程序保留了一个线程,而另一个线程程序在同一个线程上执行;

我们可以使用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
}

在我的机器上,它打印的东西是这样的,mainlocked总是有时相同,但有时不同:

main 139711253194560
locked 139711219787520
locked child 139711236572928

EDIT我忘记了GOMAXPROCS。另外,现在的结果是不同的

最新更新