Назад к вопросам
Senior
5
Если в AddTask использовать RLock, то как будут вести себя два параллельных вызова AddTask? Будут блокировать друг друга?
Компании, где спрашивали
Cloud.ru
Ответ от нейросети
sobes.tech AI
В Go sync.RWMutex предоставляет два типа блокировок: RLock для чтения и Lock для записи.
Если в функции AddTask используется RLock (т.е. блокировка для чтения), то два параллельных вызова AddTask смогут одновременно захватить RLock и выполняться параллельно, не блокируя друг друга.
Однако, если где-то в коде используется Lock (запись), то он будет ждать, пока все RLock не освободятся, и наоборот — новые RLock будут ждать, пока Lock не освободится.
Таким образом, два вызова AddTask с RLock не блокируют друг друга, но если внутри AddTask происходит модификация данных, то использование RLock неправильно и может привести к гонкам данных.
Пример:
var mu sync.RWMutex
func AddTask() {
mu.RLock() // блокировка для чтения
defer mu.RUnlock()
// чтение данных
}
Два вызова AddTask могут выполняться одновременно.