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

Метод sync.RWMutex.RLock

Метод sync.RWMutex.RLock захватывает блокировку для чтения. Он позволяет множеству горутин одновременно читать защищенные данные, но блокирует запись до тех пор, пока все блокировки чтения не будут освобождены. В отличие от Lock, метод RLock не блокирует другие операции чтения, что делает его эффективным для сценариев с частым чтением и редкой записью.

Метод не принимает никаких параметров и не возвращает значений. После вызова RLock необходимо обязательно вызвать метод RUnlock для освобождения блокировки чтения, чтобы избежать взаимных блокировок.

Синтаксис

var mu sync.RWMutex mu.RLock() // чтение защищенных данных mu.RUnlock()

Пример

Давайте рассмотрим пример чтения данных с использованием блокировки для чтения:

package main import ( "fmt" "sync" ) func main() { var mu sync.RWMutex data := make(map[string]int) // Запись данных mu.Lock() data["counter"] = 42 mu.Unlock() // Чтение данных mu.RLock() res := data["counter"] mu.RUnlock() fmt.Println(res) }

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

42

Пример

Давайте продемонстрируем, что множество горутин могут одновременно читать данные с помощью RLock:

package main import ( "fmt" "sync" "time" ) func main() { var mu sync.RWMutex counter := 0 var wg sync.WaitGroup reader := func(id int) { defer wg.Done() mu.RLock() fmt.Printf("Reader %d reads: %d\n", id, counter) time.Sleep(100 * time.Millisecond) mu.RUnlock() } for i := 0; i < 5; i++ { wg.Add(1) go reader(i) } wg.Wait() }

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

"Reader 4 reads: 0" "Reader 2 reads: 0" "Reader 1 reads: 0" "Reader 0 reads: 0" "Reader 3 reads: 0"

Пример

Давайте рассмотрим ситуацию, когда операция записи ожидает освобождения блокировок чтения:

package main import ( "fmt" "sync" "time" ) func main() { var mu sync.RWMutex counter := 0 var wg sync.WaitGroup reader := func(id int) { defer wg.Done() mu.RLock() fmt.Printf("Reader %d acquired read lock\n", id) time.Sleep(200 * time.Millisecond) fmt.Printf("Reader %d released read lock\n", id) mu.RUnlock() } writer := func() { defer wg.Done() fmt.Println("Writer waiting for write lock") mu.Lock() counter++ fmt.Println("Writer acquired write lock") mu.Unlock() } for i := 0; i < 3; i++ { wg.Add(1) go reader(i) } time.Sleep(50 * time.Millisecond) wg.Add(1) go writer() wg.Wait() }

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

"Reader 2 acquired read lock" "Reader 1 acquired read lock" "Reader 0 acquired read lock" "Writer waiting for write lock" "Reader 2 released read lock" "Reader 1 released read lock" "Reader 0 released read lock" "Writer acquired write lock"

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

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