The documentation dla runtime.LockOsThread
stany:Dlaczego Locky nie blokuje tego wątku systemu operacyjnego?
LockOSThread druty wywołujący goroutine do jego aktualnego wątku systemu operacyjnego. Dopóki wywołująca goroutine nie opuści lub nie odwiedzi UnlockOSThread, zawsze będzie wykonywana w tym wątku, a żadna inna goroutine nie będzie mogła.
Ale rozważyć ten program:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
runtime.LockOSThread()
go fmt.Println("This shouldn't run")
time.Sleep(1 * time.Second)
}
main
goroutine jest podłączony do jednego dostępnego wątku OS ustalonym przez GOMAXPROCS
, więc byłoby oczekiwać, że goroutine utworzona w wierszu 3 main
nie będzie działać. Zamiast tego program drukuje This shouldn't run
, zatrzymuje się na 1 sekundę i kończy pracę. Dlaczego to się dzieje?
, więc pytanie "Dlaczego Locky nie jest blokowany przez ten wątek systemu operacyjnego?" Powinno brzmieć "dlaczego wiele goroutines działa, nawet jeśli GOMAXPROCS jest ustawione na 1" –