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

Метод sync.Mutex.TryLock

Метод sync.Mutex.TryLock позволяет попытаться захватить мьютекс без блокировки. В отличие от метода Lock, который блокирует выполнение горутины до освобождения мьютекса, TryLock возвращает true, если захват мьютекса удался, и false, если мьютекс уже заблокирован другой горутиной. Метод не принимает никаких параметров и возвращает булево значение.

Синтаксис

var mu sync.Mutex ok := mu.TryLock()

Пример

Давайте попробуем захватить свободный мьютекс методом TryLock:

package main import ( "fmt" "sync" ) func main() { var mu sync.Mutex ok := mu.TryLock() fmt.Println(ok) mu.Unlock() }

Результат выполнения кода:

true

Пример

Теперь попробуем захватить уже заблокированный мьютекс методом TryLock:

package main import ( "fmt" "sync" "time" ) func main() { var mu sync.Mutex mu.Lock() go func() { time.Sleep(100 * time.Millisecond) mu.Unlock() }() ok := mu.TryLock() fmt.Println(ok) }

Результат выполнения кода:

false

Пример

Рассмотрим практический пример использования TryLock в циклическом опросе:

package main import ( "fmt" "sync" "time" ) func main() { var mu sync.Mutex counter := 0 // Захватываем мьютекс в другой горутине go func() { mu.Lock() time.Sleep(2 * time.Second) counter = 42 mu.Unlock() }() // Пытаемся захватить мьютекс каждые 500 мс for i := 0; i < 5; i++ { if mu.TryLock() { fmt.Printf("try %d: mutex locked, counter = %d\n", i, counter) mu.Unlock() break } fmt.Printf("try %d: mutex busy\n", i) time.Sleep(500 * time.Millisecond) } }

Результат выполнения кода:

"try 0: mutex busy" "try 1: mutex busy" "try 2: mutex busy" "try 3: mutex locked, counter = 42"

Смотрите также

  • метод sync.Mutex.Lock,
    который блокирует выполнение до захвата мьютекса
  • метод sync.Mutex.Unlock,
    который освобождает захваченный мьютекс
  • метод sync.RWMutex.TryLock,
    который пытается захватить мьютекс для записи без блокировки
  • метод sync.RWMutex.TryRLock,
    который пытается захватить мьютекс для чтения без блокировки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить