PThread RWLock Взаимная блокировка с рекурсивными блокировками - PullRequest
1 голос
/ 21 октября 2010

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

Я поместил пример кода на pastebin, потому что это больше, чем несколько строккода: http://pastebin.org/359203

Если вы запустите пример.Когда он в конечном итоге блокируется, последние три оператора печати будут в одном из двух случаев:

one:

th4: request lock
th3: request lock
th4: locked

two:

th3: request lock
th4: request lock
th3: locked

На основе выходных данных.Мне кажется, что существует возможный тупик от второго вызова функции блокировки, будь то блокировка чтения или блокировка записи.Но поскольку один из потоков имеет блокировку, а тот же поток - то, что вызывает вторую функцию блокировки, почему он блокируется?Еще более интересно, что в этом маленьком случае вызывает тупик?

Обратите внимание, что я работаю в Mac OS X и это серьезно надуманный пример.Это песочница от чего-то другого, над чем я работаю и хотел убедиться, что я правильно понял эту часть.

Ответы [ 5 ]

3 голосов
/ 21 октября 2010

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

. Это понятнее, если вы называете потоки «читатель» (thfn4) и «писатель» (thfn3).Первый случай:

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

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

Случай два:

  • писатель пытается заблокировать
  • читатель пытается заблокировать и блокирует ожидание завершения записи
  • Writer получает блокировку
  • Writer пытается заблокировать снова и блокирует

Этот случай, вероятно, можно объяснить только обращением к деталям реализации rwlock.

1 голос
/ 21 октября 2010

Ваша проблема в том, что pthread_rwlock_wrlock(3) не является реентерабельным. В документации четко указано, что результаты вызова этого метода, когда поток уже удерживает блокировку, не определены. Ваш код специально вызывает метод дважды без снятия блокировки между ними.

0 голосов
/ 31 августа 2011

Я опубликовал решение для этого вопроса в Pthread RWLock на MAC Дедлок, но не на Linux?

Он не зависит от платформы, и общий метод должен предусматривать другие приемы, такие как обновление с чтения на запись и т. Д.

0 голосов
/ 25 октября 2010

Вот ошибка открытого радара.

http://openradar.appspot.com/8588290

0 голосов
/ 25 октября 2010

См. Ошибку, которую я сообщил с яблоком. Это проблема.

https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/7/wo/0blX77DJS8lBTTxVnTsNDM/5.83.28.0.13

...