В 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 немного сложнее, методы могут использовать немного больше времени для работы.