I understand that in Go, runtime.LockOSThread() will bind a goroutine to one OS thread and not allow other goroutines to execute in that thread. Is this also true for child goro
We can check it using pthread.h's pthread_self
:
package main
// #include
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
}
On my machine it prints something like this, main
and locked
always being sometimes the same, but sometimes different:
main 139711253194560
locked 139711219787520
locked child 139711236572928
EDIT I forgot about GOMAXPROCS. Added, the results are varying now.