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