Работа с pthread_rwlock_wrlock

Использую pthread_rwlock_wrlock. для синхронизации установки и чтения свойства классно возникает вопрос: почему в блоке set свойства workProperty нужно использовать:pthread_rwlock_rdlock Ведь во время чтения значения свойства мы должны заблокировать поток, который записывает данные, а мы блокируем поток на чтение. Или это не так?

class ReadWriteLock{
    private var lock = pthread_rwlock_t()
    private var attribute = pthread_rwlockattr_t()
    private var globalProperty: Int = 0
    init(){
        pthread_rwlock_init(&lock, &attribute)
    }
    var workProperty: Int {
        get {
            pthread_rwlock_rdlock(&lock)
            print("read")
            let temp = globalProperty
            print("EndRead")
            pthread_rwlock_unlock(&lock)
            return temp
        }
        set {
            pthread_rwlock_wrlock(&lock)
            print("write")
            globalProperty = newValue
            print("endWrite")
            pthread_rwlock_unlock(&lock)
        }
    }
}

Ответы (1 шт):

Автор решения: Roman Konoval

Путаница возникает из-за того, как понимать выражение заблокировать поток на чтение. Правильнее и точнее говорить о захвате блокировки в режиме чтения. Тут я использую слово блокировка для перевода английского lock.

Часть rdlock в названии указывает не то, кого мы хотим заблокировать, а в каком режиме наш поток хочет получить блокировку. Какие параллельные потоки при этом заблокируются (если попытаются захватить блокировку) зависит от того, в каком режиме эти параллельные потоки пробуют захватить блокировку.

Операция pthread_rwlock_rdlock делает следующее:

  1. проверяет захвачена ли переданная в параметрах блокировка каким-либо потоком на запись
  2. если захвачена, то текущий поток ждет пока она не освободится и только после освобождения переход к следующему шагу
  3. помечает, что блокировка захвачена текущим потоком на чтение.

pthread_rwlock_wrlock работает похожим образом с тем отличием, что проверяет на первом шаге захвачена ли блокировка в любом режиме. И не продолжает пока она не освободится полностью.

В результате все время пока блокировка будет захвачена хотя бы одним потоком (даже на чтение) никакой другой поток не сможет ее захватить на запись. Этим и достигается то, что вы имеете ввиду, когда говорите, что читатель должен заблокировать писателя.

→ Ссылка