Sobes.tech
Назад к вопросам
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 могут выполняться одновременно.