Ответ
Да, можно использовать несколько Mutex в одной функции, но важно избегать deadlock'ов. Например, если нужно заблокировать несколько мьютексов, соблюдай одинаковый порядок их захвата во всех горутинах.
var mu1, mu2 sync.Mutex
func process() {
mu1.Lock()
defer mu1.Unlock()
mu2.Lock()
defer mu2.Unlock()
// работа с защищенными данными
}
Опасность: если в другой горутине порядок будет обратным (mu2 -> mu1), может возникнуть deadlock. Для таких случаев лучше использовать sync.RWMutex или пересматривать архитектуру.