РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1556 of 1593 menu

Функция 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,
    которая возвращает количество активных горутин
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить