Аарон: Я только что столкнулся с этим.Я обнаружил, что это можно обойти, используя локальное хранилище потоков.Создайте обертку вокруг rwlock, которая увеличивает локальный ключ потока:
@interface ReadWriteLock : NSObject {
pthread_key_t readKey;
pthread_key_t writeKey;
pthread_rwlock_t rwLock;
}
-(void)lockRead;
-(void)unlockRead;
-(void)lockWrite;
-(void)unlockWrite;
@end
Затем увеличивайте readKey с помощью pthread_setspecific
при вызове lockRead, уменьшайте его при вызове unlockRead, только rd_lock
, когда ключ идетот 0 до 1 и только rw_unlock
, когда ключ изменяется от 1 до 0. Скопируйте это для логики writeLock.
Поскольку pthread_setspecific
и pthread_getspecific
являются локальными для потоков, вам не нужночтобы закрыть доступ к этим.Обязательно вызовите соответствующие функции создания / инициализации pthread в init
, и убедитесь, что вы удалили все члены pthread_ * в dealloc
.
К сожалению, я не могу дать вам полный источникмое решение, но вышеупомянутый метод работает (я проверил это сильно).