Работа с 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 шт):
Путаница возникает из-за того, как понимать выражение заблокировать поток на чтение. Правильнее и точнее говорить о захвате блокировки в режиме чтения. Тут я использую слово блокировка для перевода английского lock.
Часть rdlock в названии указывает не то, кого мы хотим заблокировать, а в каком режиме наш поток хочет получить блокировку. Какие параллельные потоки при этом заблокируются (если попытаются захватить блокировку) зависит от того, в каком режиме эти параллельные потоки пробуют захватить блокировку.
Операция pthread_rwlock_rdlock делает следующее:
- проверяет захвачена ли переданная в параметрах блокировка каким-либо потоком на запись
- если захвачена, то текущий поток ждет пока она не освободится и только после освобождения переход к следующему шагу
- помечает, что блокировка захвачена текущим потоком на чтение.
pthread_rwlock_wrlock работает похожим образом с тем отличием, что проверяет на первом шаге захвачена ли блокировка в любом режиме. И не продолжает пока она не освободится полностью.
В результате все время пока блокировка будет захвачена хотя бы одним потоком (даже на чтение) никакой другой поток не сможет ее захватить на запись. Этим и достигается то, что вы имеете ввиду, когда говорите, что читатель должен заблокировать писателя.