В Go есть два типа мьютексов: Mutex
и RWMutex
.
Mutex
предложения func Lock()
и func Unlock()
.
RWMutex
предлагает эти функции, а также func RLock()
и func RUnlock()
.
Насколько я понимаю, нам следует использовать RWMutex
только тогда, когда имеется много операций чтения и мало операций записи, чтобы разрешить одновременное чтение. Блокировка записи также требует больше времени.
Но что, если я использую только RWMutex
и попеременно использую func Lock() / func Unlock()
, когда хочу разрешить одновременное чтение, и func RLock
/func RUnlock
, когда хочу сделать то же самое, что и обычный Mutex
. Используется ли RLock
/RUnlock
одновременно с обычными эквивалентными функциями мьютекса?
TLDR: Зачем использовать Mutex
, если RWMutex
предлагает ту же функциональность с большим количеством опций?
См. github.com/golang/go/issues/38813
А RWMutex
нужно заботиться о множестве проблем, например голодание писателей . Mutex
намного проще и фактически используется как строительный блок для RWMutex
.
Таким образом, в принципе вы могли бы просто использовать RWMutex
в качестве мьютекса, но тогда вы должны были бы использовать базовый Mutex
с дополнительной — в данном случае ненужной — логикой сверху. Поскольку параллелизм достаточно сложен, вы обычно стремитесь сделать все максимально простым и производительным, поэтому используете самую простую конструкцию, соответствующую вашим потребностям.
С семантической точки зрения проблем вообще нет, за исключением того, что семантика RWMutex-es немного сложнее, методы могут использовать немного больше времени для работы.