Pthread RWLock на MAC Deadlocking, но не на Linux? - PullRequest
1 голос
/ 23 октября 2010

Я экспериментировал с rwlock's на Mac и испытываю то, что, как мне кажется, не должно происходить. Существует некоторая странная комбинация использования блокировок чтения / записи с рекурсивными блокировками чтения, которая является взаимоблокировкой, но не должна быть.

Я разместил код на pastebin, потому что это больше, чем просто фрагмент. То, как написан этот код, не должно блокировать тупик, и, действительно, не работает при работе в Linux. Почему этот тупик на Mac?

http://pastebin.com/Ui9iS1ke

Есть идеи?

Ответы [ 3 ]

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

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

http://openradar.appspot.com/8588290

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

См. Ошибку, о которой я сообщил с яблоком.

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

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

Аарон: Я только что столкнулся с этим.Я обнаружил, что это можно обойти, используя локальное хранилище потоков.Создайте обертку вокруг 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.

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

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