为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容森 2021-10-11 13:30:22
我知道在 Go 中,runtime.LockOSThread()会将一个 goroutine 绑定到一个 OS 线程,并且不允许其他 goroutine 在该线程中执行。这也适用于儿童 goroutines 吗?例如:runtime.LockOSThread()go func() {    go func() {        // Do something    }()    // Do something}()这两个 goroutine 是在单个且独占的 OS 线程中执行还是仅在第一个线程中执行?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

文档的runtime.LockOSThread说:

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

(强调我的)

这意味着如果 Go 的某个实现做了你所要求的,它就会出错。

澄清:如果一个 goroutine 保留了一个线程并且另一个 goroutine 在同一线程上执行;那是错误的。


查看完整回答
反对 回复 2021-10-11
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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

}

在我的机器上,它打印出这样的东西,main而且locked总是有时相同,但有时不同:


main 139711253194560

locked 139711219787520

locked child 139711236572928

编辑我忘记了 GOMAXPROCS。补充,现在结果各不相同。


查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信