shad-go/rwmutex
Fedor Korotkiy eaf94562f0 Revert "[rwmutex] Added new tests"
This reverts commit 8c0112889f.

Remove flaky tests.
2021-04-25 16:50:53 +03:00
..
README.md Fixed typo in rwmutex/README.md 2021-03-10 16:23:07 +03:00
rwmutex.go Resolve "add rwmutex" 2021-03-05 11:58:41 +00:00
rwmutex_test.go Revert "[rwmutex] Added new tests" 2021-04-25 16:50:53 +03:00

rwmutex

sync.RWMutex -- это примитив синхронизации, предоставляющий доступ к критической секции произвольному количеству читателей, не более, чем одному писателю. При этом, если есть писатель, то читателей нет.

Что нужно сделать?

Нужно написать реализацию RWMutex используя каналы.

Использование пакета sync в этой задаче запрещено!

type RWMutex struct {}

func (rw *RWMutex) Lock() {}
func (rw *RWMutex) Unlock() {}

func (rw *RWMutex) RLock() {}
func (rw *RWMutex) RUnlock() {}

RWMutex можно представлять себе как две блокировки, блокировка на чтение и блокировка на запись.

New() возвращает RWMutex, в котором ни одна из блокировок не взята.

Процессы, желающие изменить данные (писатели), берут блокировку на запись с помощью метода Lock. Процессы, желающие прочитать данные (читатели), берут блокировку на чтение с помощью метода RLock. По окончании записи писатель отпускает блокировку на запись (Unlock). С блокировкой на чтение связано число активных читателей. При взятии блокировки (RLock) это число инкрементируется. При завершении чтения (RUnlock) блокировка на чтение уменьшает счётчик.

Свойства

  1. Писатель не заблокируется при взятии блокировки только при условии, что никакой другой писатель и никакой другой читатель не владеет соответствующей блокировкой.
  2. Если какой-то писатель взял блокировку на запись, любой новый писатель или читатель заблокируется при взятии блокировки.
  3. Если какой-то читатель взял блокировку на чтение, любой новый писатель заблокируется на взятии блокировки. Однако любой другой читатель сможет взять блокировку на чтение.

Для выполнения этих свойств достаточно двух каналов.