Создание рекурсивного pthread_rwlock_wrlock

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

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

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

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

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

5
задан pmf 19 August 2011 в 17:39
поделиться