pthreads: блокировки читателя/писателя, обновляя блокировку чтения для записи блокировки

Я использую чтение-запись, соединяет 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.

Я прочитал страницу справочника, и это довольно конкретно.

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

Что лучший способ состоит в том, чтобы обновить блокировку чтения до записи, привязывают эти обстоятельства.. Я не хочу представлять гонку на переменной, которую я защищаю.

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

Спасибо

15
задан ScaryAardvark 9 March 2010 в 08:28
поделиться

2 ответа

Что еще, кроме мертвой блокировки, вы хотите в следующем сценарии?

  • поток 1 получает блокировку чтения
  • поток 2 получает блокировку чтения
  • поток 1 просит обновить блокировку записи
  • поток 2 просит обновить блокировку записи

Поэтому я бы просто отпустил блокировку чтения, получил блокировку записи и снова проверил, нужно ли делать обновление или нет.

17
ответ дан 1 December 2019 в 04:00
поделиться

Самым простым и безопасным было бы снять блокировку на запись с того момента, когда вы можете захотеть изменить свои данные, а не с того момента, когда вы уверены, что измените их. Я знаю, что это сделает доступ к данным более сериализованным.

Я был немного удивлен, когда прочитал этот вопрос, потому что я никогда даже не думал о том, чтобы сначала взять read-lock, а затем перейти к write-lock. Что ж, в разных ситуациях могут потребоваться разные подходы.

1
ответ дан 1 December 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: