Делаем pthread_rwlock_wrlock рекурсивным - PullRequest
5 голосов
/ 19 августа 2011

У меня проблема с поведением функции pthread pthread_rwlock_wrlock . Приведенная выше спецификация гласит, что когда один поток заблокировал блокировку для записи, а тот же поток блокирует ее снова, это приводит к неопределенному поведению (на самом деле я мог наблюдать это в том, что в Linux для x86 эта функция является noop, а в PowerPC Linux - глохнет нить).

Мне нужно было бы заблокировать чтение и запись со следующими характеристиками:

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

При pthread_mutex_t рекурсивность блокировки можно контролировать с помощью флага инициализации, но это невозможно для pthread_rwlock_t.

Какие у меня варианты? На самом деле мне никогда не приходилось реализовывать этот вид примитива параллелизма в C, и я думаю, что мне здесь не хватает очевидного решения.

1 Ответ

4 голосов
/ 19 августа 2011

Честно говоря, рекурсивная блокировка имеет некоторое применение, но обычно это хак.Кажется, я не могу сейчас найти эту статью, но у Бутенхофа на это неплохо поспорили.

Вернуться к вопросу.Вы могли бы сохранить специфичный для потока флаг, который сигнализирует: «У меня есть замок».Установите его сразу после блокировки и отключите перед разблокировкой.Поскольку это единственный поток, обращающийся к нему, вы должны быть в безопасности.Поэтому при попытке блокировки вам просто нужно проверить: «Эй, эта штука уже заблокирована?».

В качестве примечания: вы уверены, что с дизайном все в порядке, если поток пытается заблокировать дважды?

РЕДАКТИРОВАТЬ

Найдено статьи .

Но если это все, что необходимо, почему POSIX имеет рекурсивные мьютексы?

Из-за смелости.

...