2 回答
TA贡献1966条经验 获得超4个赞
文档的runtime.LockOSThread
说:
LockOSThread将调用 goroutine 连接到其当前的操作系统线程。在调用 goroutine 退出或调用 UnlockOSThread 之前,它将始终在该线程中执行,而没有其他 goroutine 可以。
(强调我的)
这意味着如果 Go 的某个实现做了你所要求的,它就会出错。
澄清:如果一个 goroutine 保留了一个线程并且另一个 goroutine 在同一线程上执行;那是错误的。
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。补充,现在结果各不相同。
- 2 回答
- 0 关注
- 250 浏览
添加回答
举报