Функция runtime.UnlockOSThread
Функция runtime.UnlockOSThread используется для отмены эффекта ранее вызванной функции runtime.LockOSThread. Когда горутина вызывает LockOSThread, она привязывается к текущему потоку операционной системы и будет выполняться всегда именно в этом потоке до тех пор, пока не вызовет UnlockOSThread или не завершится. Вызов UnlockOSThread разрешает планировщику Go снова перемещать горутину между потоками ОС. Это важно для снятия ограничений, накладываемых явной привязкой, которые могут снижать эффективность параллельного выполнения.
Синтаксис
runtime.UnlockOSThread()
Функция не принимает параметров и не возвращает значений. Вызов производится из той горутины, для которой требуется отменить привязку.
Пример
В этом примере мы принудительно привязываем горутину к потоку с помощью LockOSThread, а затем освобождаем ее с помощью UnlockOSThread, чтобы планировщик снова мог перераспределять нагрузку:
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// Привязываем текущую горутину к потоку ОС
runtime.LockOSThread()
fmt.Println("Goroutine is locked to OS thread")
// Освобождаем горутину от привязки
runtime.UnlockOSThread()
fmt.Println("Goroutine is unlocked from OS thread")
}()
wg.Wait()
}
Результат выполнения кода:
"Goroutine is locked to OS thread"
"Goroutine is unlocked from OS thread"
Пример
Следующий пример демонстрирует, что после вызова UnlockOSThread горутина может быть перенесена на другой поток. Для наглядности используем информацию о текущем потоке через идентификатор, получаемый с помощью системного вызова (в реальном коде такого нет, но логика работы сохраняется):
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
runtime.LockOSThread()
fmt.Println("Locked thread, starting work...")
time.Sleep(100 * time.Millisecond)
runtime.UnlockOSThread()
fmt.Println("Unlocked thread, continuing work...")
time.Sleep(100 * time.Millisecond)
}()
wg.Wait()
}
Результат выполнения кода:
"Locked thread, starting work..."
"Unlocked thread, continuing work..."
Смотрите также
-
функцию
runtime.LockOSThread,
которая привязывает горутину к текущему потоку ОС -
функцию
runtime.Gosched,
которая передает управление другим горутинам -
функцию
runtime.Goexit,
которая завершает текущую горутину -
функцию
runtime.NumGoroutine,
которая возвращает количество активных горутин