Я использую чтение-запись, соединяет Linux, и я нашел, что попытка обновить заблокированный объект чтения до записи блокирует мертвые блокировки.
т.е.
// acquire the read lock in thread 1.
pthread_rwlock_rdlock( &lock );
// make a decision to upgrade the lock in threads 1.
pthread_rwlock_wrlock( &lock ); // this deadlocks as already hold read lock.
Я прочитал страницу справочника, и это довольно конкретно.
Вызывающий поток может зайти в тупик, если в то время, когда вызов выполняется, он содержит блокировку чтения-записи (ли чтение или блокировка записи).
Что лучший способ состоит в том, чтобы обновить блокировку чтения до записи, привязывают эти обстоятельства.. Я не хочу представлять гонку на переменной, которую я защищаю.
По-видимому, я могу создать другое взаимное исключение для затрагивания выпуска блокировки чтения и получения блокировки записи, но тогда я действительно не вижу использование блокировок чтения-записи. Я мог бы также просто использовать нормальное взаимное исключение.
Спасибо
Что еще, кроме мертвой блокировки, вы хотите в следующем сценарии?
Поэтому я бы просто отпустил блокировку чтения, получил блокировку записи и снова проверил, нужно ли делать обновление или нет.
Самым простым и безопасным было бы снять блокировку на запись с того момента, когда вы можете захотеть изменить свои данные, а не с того момента, когда вы уверены, что измените их. Я знаю, что это сделает доступ к данным более сериализованным.
Я был немного удивлен, когда прочитал этот вопрос, потому что я никогда даже не думал о том, чтобы сначала взять read-lock, а затем перейти к write-lock. Что ж, в разных ситуациях могут потребоваться разные подходы.