Sobes.tech
Senior

Եթե AddTask-ում օգտագործվի RLock, ապա ինչպես կվարվեն երկու համաժամանակյա AddTask կանչերը: Նրանք միմյանց կխոչընդոտեն?

sobes.tech AI

Պատասխան 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 могут выполняться одновременно.